Question Vérifiez si la clé existe dans le dictionnaire de type [Type: Type?]


Comment puis-je vérifier si une clé existe dans un dictionnaire? Mon dictionnaire est de type [Type:Type?].

Je ne peux pas simplement vérifier dictionary[key] == nil, car cela pourrait résulter de la valeur d'être nil.

Des idées?


26
2018-03-27 11:33


origine


Réponses:


En fait ton test dictionary[key] == nil  pouvez être utilisé pour vérifier si une clé existe dans un dictionnaire. Il ne cédera pas true si la valeur est réglé sur nil:

let dict : [String : Int?] = ["a" : 1, "b" : nil]

dict["a"] == nil // false,     dict["a"] is .Some(.Some(1))
dict["b"] == nil // false !!,  dict["b"] is .Some(.None)
dict["c"] == nil // true,      dict["c"] is .None

Distinguer entre "clé n'est pas présente dans dict" et "valeur pour clé est nulle" vous peut faire une affectation optionnelle imbriquée:

if let val = dict["key"] {
    if let x = val {
        println(x)
    } else {
        println("value is nil")
    }
} else {
    println("key is not present in dict")
}

59
2018-03-27 12:05



Je crois le type de dictionnaire indexForKey(key: Key) est ce que vous recherchez. Il retourne l'index pour une clé donnée, mais plus important encore pour vos propositions, il renvoie nil s'il ne trouve pas la clé spécifiée dans le dictionnaire.

if dictionary.indexForKey("someKey") != nil {
    // the key exists in the dictionary
}

Swift 3 syntaxe ....

if dictionary.index(forKey: "someKey") == nil {
    print("the key 'someKey' is NOT in the dictionary")
}

29
2018-03-27 11:44



Vous pouvez toujours faire:

let arrayOfKeys = dictionary.allKeys
if (arrayOfKeys.containsObject(yourKey)) {

}
else {
}

Cependant, je n'aime vraiment pas l'idée de créer un NSDictionary pouvant contenir des options.


2
2018-03-27 11:38



Essaye ça:

let value = dict[key] != nil

J'espère que cela fonctionne pour vous. Merci


1
2018-02-01 02:41



Cela fonctionne pour moi [Swift 3.0]:

let myVar = "c"
let myDict: [String: Int] = ["a": 0, "b": 1, "c": 2]
if myDict.keys.contains(myVar) {
   print(myVar)
} else {
   print("ERROR")
}

0
2017-12-18 23:53



Je l'ai géré de cette façon dans Swift 4:

extension Dictionary {
    func contains(key: Key) -> Bool {
        let value = self.contains { (k,_) -> Bool in key == k }
        return value
    }
}

Cela utilise Dictionary.contains(where: (key: Hashable, value: Value) throws -> Bool). En l'encapsulant en tant qu'extension, j'ai une bonne idée de mettre à jour l'implémentation sans modifier mon code. J'évite de créer des données, qui index(forKey:Key) Est-ce que. J'espère que c'est plus efficace que d'accéder à keys car cela doit créer l'ensemble du tableau avant de le chercher.


-1
2018-02-14 16:33