enum PostType: Decodable {
init(from decoder: Decoder) throws {
// What do i put here?
}
case Image
enum CodingKeys: String, CodingKey {
case image
}
}
Was setze ich, um dies zu vervollständigen? Nehmen wir auch an, ich habe das geändert case
:
case image(value: Int)
Wie kann ich dies an Decodable anpassen?
EDit Hier ist mein vollständiger Code (der nicht funktioniert)
let jsonData = """
{
"count": 4
}
""".data(using: .utf8)!
do {
let decoder = JSONDecoder()
let response = try decoder.decode(PostType.self, from: jsonData)
print(response)
} catch {
print(error)
}
}
}
enum PostType: Int, Codable {
case count = 4
}
Final Edit Wie wird es mit einer solchen Aufzählung umgehen?
enum PostType: Decodable {
case count(number: Int)
}
iOS 13.3
. Ich teste iniOS 13.3
undiOS 12.4.3
sie verhalten sich anders. UnteriOS 13.3
kann enum nur en- / decodiert werden.So erstellen Sie Enums mit zugeordneten Typen
Codable
Diese Antwort ähnelt der von @Howard Lovatt, vermeidet jedoch das Erstellen einer
PostTypeCodableForm
Struktur und verwendet stattdessen den von Apple bereitgestelltenKeyedEncodingContainer
Typ als Eigenschaft für und , wodurch die Boilerplate reduziert wird.Encoder
Decoder
Dieser Code funktioniert für mich auf Xcode 9b3.
quelle
Either
codierbarSwift würde einen
.dataCorrupted
Fehler auslösen, wenn ein unbekannter Aufzählungswert auftritt. Wenn Ihre Daten von einem Server stammen, können Sie jederzeit einen unbekannten Aufzählungswert erhalten (Fehler auf der Serverseite, neuer Typ in einer API-Version hinzugefügt und Sie möchten, dass die vorherigen Versionen Ihrer App den Fall ordnungsgemäß behandeln usw.). Sie sollten besser vorbereitet sein und "defensiven Stil" codieren, um Ihre Aufzählungen sicher zu dekodieren.Hier ist ein Beispiel, wie es geht, mit oder ohne zugehörigen Wert
Und wie man es in einer umschließenden Struktur verwendet:
quelle
Um die Antwort von @ Toka zu erweitern, können Sie der Aufzählung auch einen rohen darstellbaren Wert hinzufügen und den optionalen Standardkonstruktor verwenden, um die Aufzählung ohne
switch
:Es kann mithilfe eines benutzerdefinierten Protokolls erweitert werden, mit dem der Konstruktor umgestaltet werden kann:
Es kann auch leicht erweitert werden, um einen Fehler auszulösen, wenn ein ungültiger Aufzählungswert angegeben wurde, anstatt einen Wert als Standard festzulegen. Das Wesentliche zu dieser Änderung finden Sie hier: https://gist.github.com/stephanecopin/4283175fabf6f0cdaf87fef2a00c8128 .
Der Code wurde mit Swift 4.1 / Xcode 9.3 kompiliert und getestet.
quelle
Eine Variante der Antwort von @ proxpero, die kürzer ist, besteht darin, den Decoder wie folgt zu formulieren:
Dies ermöglicht dem Compiler eine umfassende Überprüfung der Fälle und unterdrückt auch nicht die Fehlermeldung für den Fall, dass der codierte Wert nicht mit dem erwarteten Wert des Schlüssels übereinstimmt.
quelle
Eigentlich sind die obigen Antworten wirklich großartig, aber es fehlen einige Details für das, was viele Leute in einem kontinuierlich entwickelten Client / Server-Projekt benötigen. Wir entwickeln eine App, während sich unser Backend im Laufe der Zeit kontinuierlich weiterentwickelt, was bedeutet, dass einige Enum-Fälle diese Entwicklung ändern werden. Wir brauchen also eine Enum-Decodierungsstrategie, die Arrays von Enums dekodieren kann, die unbekannte Fälle enthalten. Andernfalls schlägt das Dekodieren des Objekts, das das Array enthält, einfach fehl.
Was ich getan habe, ist ganz einfach:
Bonus: Implementierung ausblenden> Machen Sie es zu einer Sammlung
Implementierungsdetails zu verbergen ist immer eine gute Idee. Dafür benötigen Sie nur ein bisschen mehr Code. Der Trick besteht darin, sich
DirectionsList
anCollection
Ihr interneslist
Array anzupassen und es privat zu machen:Weitere Informationen zum Anpassen an benutzerdefinierte Sammlungen finden Sie in diesem Blogbeitrag von John Sundell: https://medium.com/@johnsundell/creating-custom-collections-in-swift-a344e25d0bb0
quelle
Sie können tun, was Sie wollen, aber es ist ein bisschen kompliziert :(
quelle