Verwendung von Any in Codable Type

8

Ich arbeite gerade mit Codable types in meinem Projekt und stehe vor einem Problem.

%Vor%

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.

    
PGDev 17.01.2018, 09:07
quelle

6 Antworten

12

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%     
Scriptable 17.01.2018, 09:16
quelle
8

Quantenwert

Zunächst können Sie einen Typ definieren, der sowohl von String als auch von Int dekodiert werden kann. Hier ist es.

%Vor%

Person

Jetzt können Sie Ihre Struktur wie folgt definieren

%Vor%

Das ist es. Lass es uns testen!

JSON 1: id ist String

%Vor%

JSON 2: id ist Int

%Vor%     
Luca Angeletti 22.01.2018 18:54
quelle
5

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%     
Giuseppe Lanza 22.01.2018 17:53
quelle
2

Sie können Any durch eine enum ersetzen, die ein Int oder ein String akzeptiert:

%Vor%

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.

    
Clafou 22.01.2018 17:04
quelle
2

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

quelle
1

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.

%Vor%

Beispiele

Codiere Objekt mit numerischem id :

%Vor%

Codieren Sie das Objekt mit der Zeichenfolge id :

%Vor%

Dekodierung zu numerischem id :

%Vor%

Dekodierung in Zeichenkette id :

%Vor%

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.

    
djromero 22.01.2018 18:30
quelle