2017-09-24 4 views
2

Comment gérez-vous un champ d'une structure codable de JSON qui peut être une chaîne vide ou un int? J'ai essayé d'utiliser le type de données tout mais cela n'est pas conforme à codable. Je pense que s'il n'a pas de valeur alors il retourne une chaîne vide ou sinon, il retourne un int. J'utilise Swift 4 et XCode 9. Merci d'avanceComment concevoir un champ JSON codable qui peut être une chaîne vide ou un entier

+0

Quel est le type de ce champ dans votre type Swift? 'Int?' –

+0

Oui, je voudrais utiliser un int pour ce champ. Si c'est une chaîne vide, je voudrais par défaut à 0 si possible ou nul. –

Répondre

2

Je voudrais vraiment suggérer de changer ce service Web pour retourner des valeurs de manière cohérente (et s'il n'y a pas de valeur pour le type entier, ne rien retourner pour cette clé).

Mais si vous êtes bloqué avec cette conception, vous devrez écrire votre propre init(from:) qui gère avec élégance l'échec d'analyser la valeur entière. .: par exemple

struct Person: Codable { 
    let name: String 
    let age: Int? 

    init(from decoder: Decoder) throws { 
     let values = try decoder.container(keyedBy: CodingKeys.self) 
     name = try values.decode(String.self, forKey: .name) 
     do { 
      age = try values.decode(Int.self, forKey: .age) 
     } catch { 
      age = nil 
     } 
    } 

} 

Je conseille également de ne pas utiliser 0 comme valeur sentinelle pour « aucune valeur entière fourni ». C'est ce que les options sont pour.

+1

Merci pour votre aide. Je suppose que je vais devoir faire un long tour parce que je n'ai pas accès pour changer le serveur. –

+0

Lol. Oui, nous avons tous été là, avec une interface discutable gérée par d'autres. – Rob