J'utilise actuellement les morceaux de code suivants (maladroits) pour déterminer si un dictionnaire Swift (non vide) contient une clé donnée et pour obtenir une valeur (quelconque) 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
}
Vous n'avez pas besoin de aucun code spécial pour le faire, car c'est ce que fait déjà un dictionnaire. Lorsque vous récupérez dict[key]
, vous savez si le dictionnaire contient la clé, car l'option que vous récupérez n'est pas nil
(et il contient la valeur).
Donc, si vous seulement voulez répondre à la question de savoir si le dictionnaire contient la clé, demandez:
let keyExists = dict[key] != nil
Si vous voulez la valeur et que vous connaissez le dictionnaire contient la clé, dites:
let val = dict[key]!
Mais si, comme cela se produit habituellement, vous ne savez pas qu'elle contient la clé - vous voulez la récupérer et l'utiliser, mais seulement si elle existe - utilisez quelque chose comme if let
:
if let val = dict[key] {
// now val is not nil and the Optional has been unwrapped, so use it
}
Pourquoi ne pas simplement rechercher dict.keys.contains(key)
? La vérification de dict[key] != nil
ne fonctionnera pas dans les cas où la valeur est nil . Comme avec un dictionnaire [String: String?]
par exemple.
La réponse acceptée let keyExists = dict[key] != nil
ne fonctionnera pas si le dictionnaire contient la clé mais a la valeur nil.
Si vous voulez vous assurer que le dictionnaire ne contient pas la clé, utilisez-le (testé dans Swift 4).
if dict.keys.contains(key) {
// contains key
} else {
// does not contain key
}
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 simplement la première valeur si cette clé n’existe pas:
extension Dictionary {
func keyedOrFirstValue(key: Key) -> Value? {
// if key not found, replace the nil with
// the first element of the values collection
return self[key] ?? first(self.values)
// note, this is still an optional (because the
// dictionary could be empty)
}
}
let d = ["one":"red", "two":"blue"]
d.keyedOrFirstValue("one") // {Some "red"}
d.keyedOrFirstValue("two") // {Some "blue"}
d.keyedOrFirstValue("three") // {Some "red”}
Notez que rien ne garantit ce que vous obtiendrez comme première valeur. Dans ce cas, il se trouve que le résultat est «rouge».
if dictionayTemp["quantity"] != nil
{
//write your code
}
Voici ce qui fonctionne pour moi sur Swift 3
let _ = (dict[key].map { $0 as? String } ?? "")
Ma solution pour une implémentation de cache qui stocke NSAttributedString en option:
public static var attributedMessageTextCache = [String: NSAttributedString?]()
if attributedMessageTextCache.index(forKey: "key") != nil
{
if let attributedMessageText = TextChatCache.attributedMessageTextCache["key"]
{
return attributedMessageText
}
return nil
}
TextChatCache.attributedMessageTextCache["key"] = .some(.none)
return nil