2017-09-28 6 views
0

J'utilise l'API de quelqu'un d'autre. Il me renvoie JSON. Comme ça;Puis-je déclarer une variable nommée 'Type' dans Swift?

[{"ID": 123, 
"Name": "My Game Api", 
"Type": "Racing", 
"Num": 0, 
"Country": "England" 
}] 

Je définir une struct pour analyser JSON, comme ceci:

struct MyResult : Decodable{ 
    var ID : Int? 
    var Name : String? 
    var Type : String? 
    var Num : Int? 
    var Country : String? 
} 
// Using.. 
    let games = try JSONDecoder().decode([MyResult].self, from: data!) 

Bien sûr xCode me donne une erreur: membre de type ne peut pas être nommé 'Type', car il serait en conflit avec l'expression 'foo.Type'.

Je n'ai pas écrit l'API. Si je change le nom de la variable Type, je ne peux pas lire la valeur. Puis-je utiliser Struct décodable sans modifier l'API?

+5

Comparer https://stackoverflow.com/q/44396500/2976878. Vous devez utiliser les noms de propriété 'lowerCamelCase' comme le veut la convention Swift; et mappez vos clés JSON dans une énumération 'CodingKeys' personnalisée. – Hamish

+0

https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types#2904057 – Slayter

+1

Aussi, sans rapport, mais est-ce que toutes vos propriétés doivent vraiment être optionnelles? Est-il légal que votre JSON ne contienne pas de clés pour * tout * d'entre eux? – Hamish

Répondre

0

Vous pouvez utiliser comme ci-dessous:

struct MyResult : Decodable { 
    var ID : Int? 
    var Name : String? 
    var type : String? 
    var Num : Int? 
    var Country : String? 

    private enum CodingKeys : String, CodingKey { 
     case ID, Name, type = "Type", Num, Country 
    } 
} 

Essayez de suivre les commentaires postés par Hamish

+3

C'est une convention Swift de nommer vos types en commençant par une lettre minuscule. Et faites juste la même chose que pour "Type" pour les autres propriétés –

+2

btw vous devriez déclarer toutes les propriétés de struct comme des constantes en utilisant let et probablement aucune d'entre elles ne doit être optionnelle –