Ich arbeite gerade mit Codable
types in meinem Projekt und stehe vor einem Problem.
id
im obigen Code könnte entweder ein String
oder ein Int
sein. Dies ist der Grund, dass id
vom Typ Any
ist.
Ich weiß, dass Any
nicht Codable
ist.
Was ich wissen muss ist, wie ich es zum Laufen bringen kann. Jede Art von Hilfe wird geschätzt.
Codable muss den Typ kennen, in den gewirkt werden soll.
Zuerst würde ich versuchen, das Problem zu lösen, den Typ nicht zu kennen, zu sehen, ob Sie das beheben und es einfacher machen können.
Sonst ist der einzige Weg, wie ich Ihr Problem lösen kann, Generika wie unten zu verwenden.
%Vor% Zunächst können Sie einen Typ definieren, der sowohl von String
als auch von Int
dekodiert werden kann.
Hier ist es.
Jetzt können Sie Ihre Struktur wie folgt definieren
%Vor%Das ist es. Lass es uns testen!
id
ist String
id
ist Int
Ich habe dieses Problem gelöst, indem ich ein neues Decodable Struct namens AnyDecodable definiert habe, also anstelle von Any verwende ich AnyDecodable. Es funktioniert perfekt auch mit verschachtelten Typen.
Versuchen Sie es auf einem Spielplatz:
%Vor%Sie könnten meine Struktur zu AnyCodable erweitern, wenn Sie sich auch für den Encoding-Teil interessieren.
Bearbeiten: Ich habe es tatsächlich getan.
Hier ist AnyCodable
%Vor%Sie können es mit dem vorherigen json auf diese Weise auf einem Spielplatz testen:
%Vor% Sie können Any
durch eine enum ersetzen, die ein Int
oder ein String
akzeptiert:
Dann wird der Compiler über die Tatsache beschweren, dass Id
nicht mit Decodable
übereinstimmt. Da Id
zugeordnete Werte hat, müssen Sie dies selbst implementieren. Lesen Sie Ссылка für ein Beispiel, wie Sie dies tun können.
Wenn Ihr Problem darin besteht, dass der Typ der ID unsicher ist, da es sich entweder um eine Zeichenfolge oder einen ganzzahligen Wert handelt, kann ich Ihnen diesen Blogpost vorschlagen: Giuseppe Lanza 24.01.2018 10:50
Erstens, wie Sie in anderen Antworten und Kommentaren lesen können, ist die Verwendung von Any
für dieses Design nicht gut. Wenn möglich, überlege es dir noch einmal.
Wenn Sie aus eigenen Gründen daran festhalten möchten, sollten Sie Ihre eigene Kodierung / Dekodierung schreiben und eine Art Konvention im serialisierten JSON übernehmen.
Der Code unten implementiert es durch die Kodierung von id
immer als String und Dekodierung zu Int
oder String
abhängig vom gefundenen Wert.
Codiere Objekt mit numerischem id
:
Codieren Sie das Objekt mit der Zeichenfolge id
:
Dekodierung zu numerischem id
:
Dekodierung in Zeichenkette id
:
Eine alternative Implementierung wäre das Kodieren nach Int
oder String
und das Umschließen der Dekodierungsversuche in do...catch
.
Im Codierteil:
%Vor%Und dann in mehreren Versuchen zum richtigen Typ dekodieren:
%Vor%Es ist meiner Meinung nach hässlicher.
Abhängig von der Kontrolle, die Sie über die Server-Serialisierung haben, können Sie eine von beiden verwenden oder etwas anderes schreiben, das an die tatsächliche Serialisierung angepasst ist.