enum PostType: Decodable {
init(from decoder: Decoder) throws {
// What do i put here?
}
case Image
enum CodingKeys: String, CodingKey {
case image
}
}
Que dois-je mettre pour compléter cela? Aussi, disons que j'ai changé le case
en ceci:
case image(value: Int)
Comment rendre cela conforme à Decodable?
EDit Voici mon code complet (qui ne fonctionne pas)
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 Aussi, comment va-t-il gérer une énumération comme celle-ci?
enum PostType: Decodable {
case count(number: Int)
}
iOS 13.3
. Je testeiOS 13.3
etiOS 12.4.3
, ils se comportent différemment. SousiOS 13.3
, enum peut être encodé / décodé uniquement.Comment rendre les énumérations avec les types associés conformes à
Codable
Cette réponse est similaire à celle de @Howard Lovatt mais évite de créer une
PostTypeCodableForm
structure et utilise à la place leKeyedEncodingContainer
type fourni par Apple comme propriété surEncoder
etDecoder
, ce qui réduit le passe-partout.Ce code fonctionne pour moi sur Xcode 9b3.
la source
Either
codablesSwift lèverait une
.dataCorrupted
erreur s'il rencontre une valeur d'énumération inconnue. Si vos données proviennent d'un serveur, il peut vous envoyer une valeur d'énumération inconnue à tout moment (bogue côté serveur, nouveau type ajouté dans une version d'API et vous voulez que les versions précédentes de votre application gèrent le cas avec élégance, etc.), vous feriez mieux d'être préparé et de coder "style défensif" pour décoder en toute sécurité vos énumérations.Voici un exemple de marche à suivre, avec ou sans valeur associée
Et comment l'utiliser dans une structure englobante:
la source
Pour étendre la réponse de @ Toka, vous pouvez également ajouter une valeur brute représentable à l'énumération et utiliser le constructeur facultatif par défaut pour construire l'énumération sans
switch
:Il peut être étendu à l'aide d'un protocole personnalisé qui permet de refactoriser le constructeur:
Il peut également être facilement étendu pour générer une erreur si une valeur d'énumération non valide a été spécifiée, plutôt que par défaut sur une valeur. Gist avec ce changement est disponible ici: https://gist.github.com/stephanecopin/4283175fabf6f0cdaf87fef2a00c8128 .
Le code a été compilé et testé avec Swift 4.1 / Xcode 9.3.
la source
Une variante de la réponse de @ proxpero qui est terser serait de formuler le décodeur comme:
Cela permet au compilateur de vérifier de manière exhaustive les cas et ne supprime pas non plus le message d'erreur pour le cas où la valeur codée ne correspond pas à la valeur attendue de la clé.
la source
En fait, les réponses ci-dessus sont vraiment excellentes, mais il leur manque quelques détails sur ce dont beaucoup de gens ont besoin dans un projet client / serveur développé en permanence. Nous développons une application pendant que notre backend évolue continuellement au fil du temps, ce qui signifie que certains cas d'énumération changeront cette évolution. Nous avons donc besoin d'une stratégie de décodage enum capable de décoder des tableaux d'énumérations contenant des cas inconnus. Sinon, le décodage de l'objet qui contient le tableau échoue tout simplement.
Ce que j'ai fait est assez simple:
Bonus: Masquer la mise en œuvre> En faire une collection
Masquer les détails de l'implémentation est toujours une bonne idée. Pour cela, vous aurez besoin d'un peu plus de code. L'astuce est de se conformer
DirectionsList
àCollection
et rendre votre intérieurlist
tableau privé:Vous pouvez en savoir plus sur la conformité aux collections personnalisées dans cet article de blog de John Sundell: https://medium.com/@johnsundell/creating-custom-collections-in-swift-a344e25d0bb0
la source
Vous pouvez faire ce que vous voulez, mais c'est un peu compliqué :(
la source