web-dev-qa-db-fra.com

Déterminer si le dictionnaire Swift contient la clé et obtenir l'une de ses valeurs

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
}
207
Drux

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
}
384
matt

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.

35
Hans Terje Bakke

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
}
15
bergy

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».

5
Airspeed Velocity
if dictionayTemp["quantity"] != nil
    {

  //write your code
    }
1
Paresh Hirpara

Voici ce qui fonctionne pour moi sur Swift 3

let _ = (dict[key].map { $0 as? String } ?? "")
1
ΩlostA

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
0
Rishi