2017-10-20 23 views
0

Je suis en train de refactoriser des projets où j'avais précédemment utilisé des analyseurs JSON tiers et j'ai rencontré un site loufoque qui retourne un booléen sous forme de chaîne.Convertir une réponse JSON à un booléen en utilisant Swift 4 Decodable

Ceci est l'extrait pertinent de la réponse JSON:

{ 
    "delay": "false", 
    /* a bunch of other keys*/ 
} 

Mon struct Décodage ressemble à ceci:

struct MyJSONStruct: Decodable { 
    let delay: Bool 
    // the rest of the keys 
} 

Comment puis-je convertir la chaîne retournée dans la réponse JSON dans un Bool pour correspondre à ma structure dans Swift 4? Alors que this post était utile, je ne peux pas comprendre comment transformer une réponse de chaîne en une valeur booléenne.

+2

override 'init (décodeur: décodeur) 'et gérer manuellement TOUT le décodage. Je dis tout parce que vous ne pouvez pas éventuellement décoder certains champs et pas d'autres. – Brandon

+0

Ouch. J'ai ~ 20 touches avec des structures imbriquées, toutes pour un booléen. – Adrian

+2

Comparez https://stackoverflow.com/q/44594652/2976878 – Hamish

Répondre

3

Fondamentalement, vous devez écrire un initialiseur personnalisé mais s'il y a beaucoup de bonnes clés mais une seule à la carte d'un type à l'autre une propriété calculée pourrait être utile

struct MyJSONStruct: Decodable { 
    var delay: String 
    // the rest of the keys 

    var boolDelay : Bool { 
     get { return delay == "true" } 
     set { delay = newValue ? "true" : "false" } 
    } 
} 
+0

Oh! C'est brillant! Je préfère ajouter 3 lignes de code à un initialiseur personnalisé. Je vous remercie! – Adrian

+0

@LeoDabus J'ai changé 'let' en' var'. Merci encore pour cette solution de contournement simple. – Adrian