web-dev-qa-db-de.com

Ruft von AnyObject (NSString) nach String ab

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?

17
Daij-Djan

Ich endete mit der hässlichen Linie:

var uuidString:String = regionToMonitor["uuid"] as! String

keine Warnungen, keine Fehler, kein Laufzeitfehler

44
Daij-Djan

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.

11
Amitay

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. :)

3
rickster

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.

2
Leandros

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.

1
ACengiz

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.

0
Mike Seghers

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")
}
0
ggomeze