J'utilise actuellement les morceaux de code (maladroits) suivants pour déterminer si un dictionnaire Swift (non vide) contient une clé donnée et pour obtenir une (toute) valeur à partir du même dictionnaire.
Comment peut-on mettre cela plus élégamment dans Swift?
// excerpt from method that determines if dict contains key
if let _ = dict[key] {
return true
}
else {
return false
}
// excerpt from method that obtains first value from dict
for (_, value) in dict {
return value
}
swift
dictionary
Drux
la source
la source
indexForKey
si vous pensez que c'est plus clair et plus explicite; stackoverflow.com/a/29299943/294884cityName:String = dict["city"] ?? ""
le?? ""
ici signifie essentiellement "s'il n'y a pas une telle clé, retournez un blanc".Réponses:
Vous n'avez pas besoin de code spécial pour cela, car c'est déjà ce que fait un dictionnaire. Lorsque vous récupérez,
dict[key]
vous savez si le dictionnaire contient la clé, car l'option facultative que vous récupérez n'est pasnil
(et il contient la valeur).Donc, si vous voulez simplement répondre à la question de savoir si le dictionnaire contient la clé, demandez:
Si vous voulez la valeur et que vous savez que le dictionnaire contient la clé, dites:
Mais si, comme cela arrive habituellement, vous ne savez pas qu'elle contient la clé - vous voulez la récupérer et l'utiliser, mais seulement si elle existe - alors utilisez quelque chose comme
if let
:la source
dict.values
.dict.values
est opaque. Vous pouvez le parcourir, mais c'est tout. (D'accord, ce n'est pas tout, mais faites-moi plaisir.) Si vous voulez qu'il soit réifié en tableau, prenezdict.values.array
.let d = ["hey":"ho"]; let s = d["hey"]; print(s)
c'est une option, comme cela a toujours été le cas.Pourquoi ne pas simplement vérifier
dict.keys.contains(key)
? La vérification dedict[key] != nil
ne fonctionnera pas dans les cas où la valeur est nulle. Comme avec un dictionnaire[String: String?]
par exemple.la source
if let val = dict[key]
vous pouvez utiliserif let val = dict[key] as? String
dans ce cas.dict.keys
qui crée un tableau avec toutes les clés, puis (2) vérifie chaque clé dans l'ordre jusqu'à ce que vous en trouviez une (ou aucune!). Je me rends compte que vous essayez d'aborder le cas d'un[String: String?]
, mais seriez très prudent avec cette solution ...La réponse acceptée
let keyExists = dict[key] != nil
ne fonctionnera pas si le dictionnaire contient la clé mais a une valeur nulle.Si vous voulez être sûr que le dictionnaire ne contient pas du tout la clé, utilisez ceci (testé dans Swift 4).
la source
== nil
fonctionne, même si le dictionnaire a des valeurs facultatives. Cela est dû au fait que le résultat de la recherche est encapsulé en tant queOptional
. D'autre part, pour vérifier si la valeur recherchée est vraimentnil
plutôt qu'absente, vous pouvez utiliser== .some(nil)
.O(1)
. Voir aussi: github.com/apple/swift-evolution/blob/master/proposals/… Qu'est-ce qui vous a fait croire que c'étaitO(n)
?Dictionary.Keys.contains(...)
fonction indique ici qu'elle estO(n)
complexe, oùn
est la longueur de la séquence.On dirait que vous avez obtenu ce dont vous avez besoin de @matt, mais si vous voulez un moyen rapide d'obtenir une valeur pour une clé, ou tout simplement la première valeur si cette clé n'existe pas:
Remarque, aucune garantie de ce que vous obtiendrez réellement comme première valeur, il se produit juste dans ce cas de retourner "rouge".
la source
??
opérateur m'a pris ma solution de commodité, mais en tant qu'extension, cette valeur par défaut pourrait présenter des insécurités de données ou des comportements inattendus. Cela ressemble à quelque chose qu'une sous-classe concrèteDictionary
devrait utiliser. À quelle fréquence avez-vous besoin de la première valeur en cas denil
retour hors fonctionnalité spécifique à la situation?la source
Ma solution pour une implémentation de cache qui stocke NSAttributedString en option:
la source
Voici ce qui fonctionne pour moi sur Swift 3
la source