Ich verwende derzeit die folgenden (ungeschickten) 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 eleganter in Swift setzen?
// 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
quelle
quelle
indexForKey
wenn Sie der Meinung sind, dass es klarer und expliziter ist. stackoverflow.com/a/29299943/294884cityName:String = dict["city"] ?? ""
Das?? ""
hier bedeutet im Grunde "wenn es keinen solchen Schlüssel gibt, geben Sie ein Leerzeichen zurück".Antworten:
Dazu benötigen Sie keinen speziellen Code, da dies bereits in einem Wörterbuch der Fall ist. Wenn Sie abrufen
dict[key]
, wissen Sie , ob das Wörterbuch den Schlüssel enthält, da die Option, die Sie zurückerhalten, nicht vorhanden istnil
(und den Wert enthält).Wenn Sie also nur die Frage beantworten möchten, ob das Wörterbuch den Schlüssel enthält, fragen Sie:
Wenn Sie den Wert möchten und wissen, dass das Wörterbuch den Schlüssel enthält, sagen Sie:
Wenn Sie jedoch wie gewöhnlich nicht wissen, dass der Schlüssel enthalten ist - Sie möchten ihn abrufen und verwenden, aber nur, wenn er vorhanden ist -, verwenden Sie Folgendes
if let
:quelle
dict.values
.dict.values
es undurchsichtig ist. Sie können es durchfahren, aber das ist alles. (Okay, es ist nicht alles, aber humor mich.) Wenn Sie möchten, dass es zu einem Array geändert wird, nehmen Siedict.values.array
.let d = ["hey":"ho"]; let s = d["hey"]; print(s)
Sie Folgendes: Es ist optional, so wie es immer war.Warum nicht einfach nachsehen
dict.keys.contains(key)
? Das Überprüfen aufdict[key] != nil
funktioniert nicht in Fällen, in denen der Wert Null ist. Wie[String: String?]
zum Beispiel bei einem Wörterbuch .quelle
if let val = dict[key]
, können Sieif let val = dict[key] as? String
in diesem Fall verwenden.dict.keys
ein Array mit allen Schlüsseln aufrufen und dann (2) jeden Schlüssel der Reihe nach überprüfen, bis Sie einen (oder keinen!) Finden. Mir ist klar, dass Sie versuchen, den Fall von a anzusprechen[String: String?]
, aber mit dieser Lösung sehr vorsichtig sein würden ...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 sicher sein möchten, dass das Wörterbuch den Schlüssel überhaupt nicht enthält, verwenden Sie diesen (in Swift 4 getestet).
quelle
== nil
funktioniert auch dann, wenn das Wörterbuch optionale Werte enthält. Dies liegt daran, dass das Suchergebnis alsOptional
. Auf der anderen Seite können Sie verwenden, um zu überprüfen, ob der nachgeschlagene Wert wirklichnil
nicht vorhanden ist== .some(nil)
.O(1)
. Siehe auch: github.com/apple/swift-evolution/blob/master/proposals/… Warum haben Sie das gedachtO(n)
?Dictionary.Keys.contains(...)
Funktion hier besagt, dass sieO(n)
komplex ist, wobein
die Länge der Sequenz ist.Sieht so aus, als hätten Sie von @matt das bekommen, was Sie brauchen, aber wenn Sie schnell einen Wert für einen Schlüssel erhalten möchten, oder nur den ersten Wert, wenn dieser Schlüssel nicht vorhanden ist:
Beachten Sie, dass keine Garantie dafür besteht, was Sie tatsächlich als ersten Wert erhalten. In diesem Fall wird lediglich "rot" zurückgegeben.
quelle
??
Operators hat mir meine bequeme Lösung genommen, aber als Erweiterung könnte dieser Standardwert Datenunsicherheiten oder unerwartetes Verhalten darstellen. Das klingt nach etwas, das eine konkrete Unterklasse verwendenDictionary
sollte. Wie oft benötigen Sie den ersten Wert bei einernil
Rückgabe ohne situationsspezifische Funktionalität?quelle
Meine Lösung für eine Cache-Implementierung, in der optional NSAttributedString gespeichert ist:
quelle
Folgendes funktioniert bei Swift 3 für mich
quelle