Ich lese einen plist-Schlüssel (NSArray mit n NSD-Wörterbüchern):
let regionsToMonitor = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String,AnyObject>>
jetzt iteriere ich darüber:
for regionToMonitor in regionsToMonitor {
und jetzt möchte ich uuidString vom regionToMonitor erhalten
in ObjC: NSString *uuidString = regionToMonitor[@"uuidString"];
in Swift versuche ich: let uuidString = regionToMonitor["uuid"]!.stringValue;
das obige kompiliert zwar, aber der String ist in Swift immer nil
. regionToMonitor["uuid"]
bei Verwendung ohne! .stringValue funktioniert gut in println
wie bekomme ich hier einen gültigen Swift.String?
Ich versuche es an NSUUID zu übergeben!
Ich habe es auch versucht
let uuidString:String = regionToMonitor["uuid"]
=> AnyObject kann nicht in String konvertiert werden
let uuidString = regionToMonitor["uuid"] as String
=> Es wurde keine Überladung für 'subscript' gefunden, die die angegebenen Argumente akzeptiert
let uuidString = regionToMonitor["uuid"];
=> 'AnyObject?' kann nicht implizit auf 'String' heruntergespielt werden; Wolltest du "as" verwenden, um den Downcast zu erzwingen?
Ich endete mit der hässlichen Linie:
var uuidString:String = regionToMonitor["uuid"] as! String
keine Warnungen, keine Fehler, kein Laufzeitfehler
Ich fand das für mich zu arbeiten
var uuidString: String? = regionToMonitor["uuid"] as AnyObject? as? String
EDIT: Dies war die Antwort auf eine ältere Swift-Version
Bitte verwenden Sie die akzeptierte Antwort.
AnyObject?
ist optional, da das Wörterbuch möglicherweise einen Wert für den Schlüssel "uuid" enthält. Um einen optionalen Wert zu erhalten, müssen Sie es mit unwrap ausführen. Siehe Optionals in der Dokumentation.
Der sicherste Weg, mit einem optionalen Element umzugehen, besteht darin, es in eine bedingte Anweisung zu setzen.
if let uuidString = regionToMonitor["uuid"] {
// do something with uuidString
}
Wenn Sie absolut sicher sind, dass das Wörterbuch immer dieses Schlüssel/Wert-Paar enthält, können Sie ein implizit nicht verpacktes optionales (das Suffix !
) verwenden:
println("UUID: \(regionToMonitor["uuid"]!)")
In diesem Fall stürzt Ihre App ab, wenn der Schlüssel keinen Wert hat.
Wenn Sie !
häufig verwenden, scheint es, als würden Sie die ganze Zeit schreien ... was vielleicht veranschaulicht, warum Sie es sparsam verwenden sollten, wenn überhaupt. :)
Ich habe eine funktionierende Lösung gefunden, die ohne Warnungen und dergleichen kompiliert wird:
var regions = NSBundle.mainBundle().infoDictionary["Regions"] as Array<Dictionary<String, AnyObject>>
for region in regions {
let dict: NSDictionary = region
var uuid = dict["uuidString"] as String
}
Die infoDictionary
aus der NSBundle
gibt eine NSArray
und eine NSDictionary
zurück, nicht einen Swift.Array
oder Swift.Dictionary
. Sie sollten zwar austauschbar sein, aber vielleicht sind sie nicht so wie wir.
Ich bin nicht sicher, ob meine Lösung effektiv ist, aber hier ist sie.
var uuidVar = regionToMonitor["uuid"]
var uuidString:String = "\(uuidVar)"
Ich hoffe es hilft.
Sie können auch verwenden
var uuidString = regionToMonitor["uuid"]? as String
Es hat die gleichen Ergebnisse wie das, was Sie tun, aber es ist meiner Meinung nach klarer. Der Operator as
erzwingt das Entpacken trotzdem, sodass es sich als überflüssig erweist, das Ausrufezeichen hinter sich zu setzen. Wenn Sie das Fragezeichen hinter den Index des Index setzen, wird deutlich, dass Sie eine Option verketten.
Wenn Sie sicher sind, dass Sie den nicht verpackten Wert wünschen, können Sie einen der folgenden Werte verwenden:
var uuidString:String! = regionToMonitor["uuid"]
var uuidString = regionToMonitor["uuid"] as String!
oder sogar das:
if var uuidString = regionToMonitor["uuid"] {
println("\(uuidString) has been unwrapped")
}