web-dev-qa-db-fra.com

Méthode recommandée pour savoir si le dictionnaire SwiftyJSON a une clé

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?

Exemple:

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")
}
23
tomatentobi

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()
26
ciauri

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
9
rintaro

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.

6
Eneko Alonso

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!

1
Ash

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

0
Mazyod