it-swarm.com.de

Feststellen, ob das Swift-Wörterbuch den Schlüssel enthält, und einen seiner Werte erhalten

Ich verwende derzeit die folgenden (unbeholfenen) Codeteile, um festzustellen, ob ein (nicht leeres) Swift-Wörterbuch einen bestimmten Schlüssel enthält, und um einen (beliebigen) Wert aus demselben Wörterbuch zu erhalten.

Wie kann man das in Swift eleganter gestalten?

// 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

Sie benötigen keinen speziellen Code, um dies zu tun, da dies das ist, was ein Wörterbuch bereits tut. Wenn Sie dict[key] Abrufen, wissen Sie , ob das Wörterbuch den Schlüssel enthält, da das zurückgegebene Optional nicht nil (und es enthält den Wert).

Wenn Sie also nur die Frage beantworten möchten, ob das Wörterbuch den Schlüssel enthält, fragen Sie:

let keyExists = dict[key] != nil

Wenn Sie den Wert möchten und Sie wissen , dass das Wörterbuch den Schlüssel enthält, sagen Sie:

let val = dict[key]!

Aber wenn Sie wie gewöhnlich nicht wissen, dass der Schlüssel darin enthalten ist - Sie möchten ihn abrufen und verwenden, aber nur, wenn er vorhanden ist -, dann verwenden Sie etwas wie if let:

if let val = dict[key] {
    // now val is not nil and the Optional has been unwrapped, so use it
}
426
matt

Warum nicht einfach nach dict.keys.contains(key) suchen? Die Überprüfung nach dict[key] != nil funktioniert nicht in Fällen, in denen der Wert nil ..__ ist. Wie bei einem Wörterbuch [String: String?].

35

Die akzeptierte Antwort let keyExists = dict[key] != nil funktioniert nicht, wenn das Wörterbuch den Schlüssel enthält, aber den Wert null hat. 

Wenn Sie sicherstellen möchten, dass das Wörterbuch den Schlüssel überhaupt nicht enthält, verwenden Sie diesen (getestet in Swift 4).

if dict.keys.contains(key) {
  // contains key
} else { 
  // does not contain key
}
15
bergy

Sieht aus, als hätten Sie von @matt das, was Sie brauchen. Wenn Sie jedoch schnell einen Wert für einen Schlüssel abrufen möchten, oder nur den ersten Wert, wenn dieser Schlüssel nicht vorhanden ist

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”}

Beachten Sie, es kann nicht garantiert werden, was Sie tatsächlich als ersten Wert erhalten. In diesem Fall wird lediglich "rot" zurückgegeben.

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

  //write your code
    }
1
Paresh Hirpara

Folgendes funktioniert für mich bei Swift 3

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

Meine Lösung für eine Cache-Implementierung, in der optionaler NSAttributedString gespeichert ist:

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