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
}
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
}
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?]
.
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
}
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.
if dictionayTemp["quantity"] != nil
{
//write your code
}
Folgendes funktioniert für mich bei Swift 3
let _ = (dict[key].map { $0 as? String } ?? "")
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