J'essaie de trouver un moyen d'obtenir la valeur d'une clé dans un dictionnaire SwiftyJSON et de renvoyer une chaîne par défaut, si la clé n'est pas définie. L'exemple suivant fonctionne bien, mais je ne suis pas vraiment satisfait. Connaissez-vous une manière plus élégante?
let users: JSON = [
["id": 1, "name": "one"],
["id": 2],
["id": 3, "name": "three"]
]
for (key: String, user: JSON) in users {
println(user.object.objectForKey("name") != nil
? user["name"].stringValue
: "default")
}
La version latest de SwiftyJSON possède la fonction exists()
.
NOTE: Leur dernière documentation ne reflète pas très bien le code ... La méthode actuelle est exists()
// Returns boolean
json["name"].exists()
Il semble que SwiftyJSON définisse la propriété error
lorsque la clé subscript
est inexistante.
Donc, cela devrait fonctionner:
for (key: String, user: JSON) in users {
let name = user["name"];
println(name.error == nil ? name.stringValue : "default")
}
Par exemple: w/Version 6.1.1 (6A2006), maître courant SwiftyJSON github:
let users: JSON = [
["id": 1, "name": "one"],
["id": 2],
["id": 3, "name": NSNull()],
["id": 4, "name": "four"],
]
for (key: String, user: JSON) in users {
let name = user["name"];
name.isEmpty
println(name.error == nil ? name.stringValue : "default")
}
impressions:
one
default
four
Si vous devez vérifier si un dictionnaire SwiftyJSON
a une clé, comparez-la avec JSON.null
comme suit:
user["name"] == JSON.null // true if the key does not exist
En utilisant cette méthode, votre code pourrait ressembler à ceci:
let users: JSON = [
["id": 1, "name": "one"],
["id": 2],
["id": 3, "name": "three"]
]
for (key, user) in users {
print(user["name"] != JSON.null ? user["name"].stringValue : "default")
}
Si vous souhaitez simplement fournir une valeur par défaut, vous pouvez utiliser l’opérateur Nil Coalescing in Swift (??
) comme ceci:
let users: JSON = [
["id": 1, "name": "one"],
["id": 2],
["id": 3, "name": "three"]
]
for (key, user) in users {
print(user["name"].string ?? "default")
}
SwiftJSON fournit la méthode string
, qui renvoie une valeur facultative (String?
), contrairement à stringValue
, qui renvoie toujours un String
.
Les objets de type JSON
ont une propriété calculée appelée null
. Ceci retourne NSNull
si l'élément demandé n'existe pas, nil
s'il existe. Vous pouvez donc tester l'existence d'un objet spécifique en l'extrayant de son parent JSON
et en testant si la propriété null
existe. Personnellement, je le gère comme ça:
let object = json["key"]
if object.null == nil {
// Do something with 'object'
} else {
// Key does not exist - handle the error
}
Dans votre cas spécifique, vous pouvez utiliser ceci:
for (key: String, user: JSON) in users {
let name = user.object.objectForKey("name")
println(name.null == nil ? name.stringValue : "default")
}
... mais puisque nous savons que nous recherchons une chaîne, nous pouvons la réduire encore plus. Tout ce que vous avez à faire est de supprimer la partie "Valeur" de stringValue
, puisque string
renverra nil s'il ne peut pas générer de chaîne à partir de son contenu. Consultez également l’opérateur nuls coalescence ??
. Il est conçu pour fournir une valeur par défaut pour les variables optionnelles, alors essayez ceci:
for (key: String, user: JSON) in users {
println(user["name"].string ?? "default")
}
Nice et compact!
Autant que je sache, cela fonctionne:
let users: JSON = [
["id": 1, "name": "one"],
["id": 2],
["id": 3, "name": "three"]
]
for jsonDict in users.arrayValue {
println(jsonDict["name"].string ?? "default")
}
Pour expliquer, vous voulez convertir l'objet JSON
aux types que vous souhaitez obtenir. Si vous voulez que le type réussisse toujours (pas facultatif), utilisez xxxValue
. Par conséquent, nous lançons l'objet racine à l'aide de arrayValue
.
arrayValue
renvoie [JSON]
, que nous parcourons dans la boucle. Nous n'avons pas besoin de mettre en cas le jsonDict: JSON
à objecter, car SwiftyJSON est suffisamment intelligent pour supposer qu'il s'agit d'un dict des opérateurs en indice.
Enfin, essayez de récupérer une clé du dict, puis vérifiez si la clé peut être récupérée sous forme de chaîne à l'aide de .string
, qui est facultatif. Utilisez la fusion nulle pour attribuer une valeur par défaut.
Veuillez consulter la documentation SwiftJSON pour string
et stringValue