Swift 4 ist neu Encodable
/Decodable
Protokolle machen JSON (de) Serialisierung sehr angenehm. Ich habe jedoch noch keinen Weg gefunden, genau zu steuern, welche Eigenschaften codiert und welche decodiert werden sollen.
Ich habe festgestellt, dass das Ausschließen der Eigenschaft aus der beigefügten CodingKeys
Aufzählung die Eigenschaft insgesamt aus dem Prozess ausschließt. Gibt es jedoch eine Möglichkeit, eine genauere Kontrolle zu erzielen?
CodingKeys
Aufzählung herauszulassen .Codable
Protokolls (init(from:)
undencode(to:)
) jederzeit manuell implementieren, um die vollständige Kontrolle über den Prozess zu erhalten.Antworten:
Die Liste der zu codierenden / decodierenden Schlüssel wird von einem Typ namens gesteuert
CodingKeys
(beachten Sie dies
am Ende). Der Compiler kann dies für Sie synthetisieren, aber immer überschreiben.Angenommen, Sie möchten die Eigenschaft
nickname
sowohl von der Codierung als auch von der Decodierung ausschließen:Wenn Sie möchten, dass es asymmetrisch ist (dh codieren, aber nicht decodieren oder umgekehrt), müssen Sie Ihre eigenen Implementierungen von
encode(with encoder: )
und bereitstelleninit(from decoder: )
:quelle
nickname
einen Standardwert angeben, damit dies funktioniert. Andernfalls kann der Eigenschaft am kein Wert zugewiesen werdeninit(from:)
.encode
im asymmetrischen Beispiel angeben müssen? Da dies immer noch das Standardverhalten ist, habe ich nicht gedacht, dass es benötigt wird. Nurdecode
da kommt die Asymmetrie her.fullName
eine gespeicherte Eigenschaft nicht zugeordnet werden kann, müssen Sie einen benutzerdefinierten Codierer und Decodierer bereitstellen.Wenn Sie die Dekodierung einiger Eigenschaften aus einer großen Anzahl von Eigenschaften in der Struktur ausschließen müssen, deklarieren Sie sie als optionale Eigenschaften. Code zum Auspacken von Optionen ist weniger als das Schreiben vieler Schlüssel unter CodingKey-Enumeration.
Ich würde empfehlen, Erweiterungen zu verwenden, um berechnete Instanzeigenschaften und berechnete Typeneigenschaften hinzuzufügen. Es trennt codierbare Anpassungseigenschaften von anderer Logik und bietet somit eine bessere Lesbarkeit.
quelle
Eine andere Möglichkeit, einige Eigenschaften vom Encoder auszuschließen, ist die Verwendung eines separaten Codierungscontainers
Der gleiche Ansatz kann für den Decoder verwendet werden
quelle
Während dies getan werden kann , wird es letztendlich sehr unkompliziert und sogar unjSONy . Ich glaube, ich sehe, woher Sie kommen, das Konzept von
#id
s ist in HTML weit verbreitet, aber es wird selten in die Welt übertragen,JSON
die ich für eine gute Sache halte (TM).Einige
Codable
Strukturen können IhreJSON
Datei problemlos analysieren, wenn Sie sie mit rekursiven Hashes umstrukturieren, dh wenn Ihrerecipe
nur ein Array enthält,ingredients
das wiederum (eines oder mehrere) enthältingredient_info
. Auf diese Weise hilft Ihnen der Parser, Ihr Netzwerk in erster Linie zusammenzufügen, und Sie müssen nur dann einige Backlinks durch einfaches Durchlaufen der Struktur bereitstellen, wenn Sie sie wirklich benötigen . Da dies eine gründliche Überarbeitung IhrerJSON
und Ihrer Datenstruktur erfordert, skizziere ich nur die Idee, damit Sie darüber nachdenken. Wenn Sie es für akzeptabel halten, teilen Sie es mir bitte in den Kommentaren mit, dann könnte ich es weiter ausführen, aber je nach den Umständen können Sie möglicherweise keine der beiden ändern.quelle
Ich habe das Protokoll und seine Erweiterung zusammen mit AssociatedObject verwendet, um die Eigenschaft image (oder eine Eigenschaft, die von Codable ausgeschlossen werden muss) festzulegen und abzurufen.
Damit müssen wir keinen eigenen Encoder und Decoder implementieren
Hier ist der Code, der der Einfachheit halber den relevanten Code beibehält:
Wann immer wir auf die Image-Eigenschaft zugreifen möchten, können wir sie für das Objekt verwenden, das das Protokoll bestätigt (SCAttachmentModelProtocol).
quelle
Sie können berechnete Eigenschaften verwenden:
quelle