Ich versuche, ein JSON zu analysieren, aber ich habe einige Schwierigkeiten mit den Datentypen und vor allem die AnyObject-Typ + Downcasting.Parse JSON in Swift, AnyObject Typ
Betrachten wir das folgende JSON (es ist ein Auszug eines vollständigen JSON).
- json: Dictionary of type [String: AnyObject] (or NSDictionary, so = [NSObject, AnyObject] in Xcode 6 b3)
- "weather": Array of type [AnyObject] (or NSArray)
- Dictionary of type [String: AnyObject] (or NSDictionary, so = [NSObject, AnyObject] in Xcode 6 b3)
Mein json ist vom Typ ANYOBJECT:
{ "weather":
[
{
"id":804,
"main":"Clouds",
"description":"overcast clouds",
"icon":"04d"
}
],
}
Für mich kann die json wie folgt beschrieben werden! (Ich verwende JSONObjectWithData
, um den JSON von einer URL zu erhalten).
Ich möchte dann auf das Wetter-Wörterbuch zugreifen. Hier ist der Code, den ich geschrieben habe.
var localError: NSError?
var json: AnyObject! = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error: &localError)
if let dict = json as? [String: AnyObject] {
if let weatherDictionary = dict["weather"] as? [AnyObject] {
// Do stuff with the weatherDictionary
}
}
Hier ist der Fehler, den ich
bekamPlayground execution failed: error: <EXPR>:28:56: error: '[AnyObject]' is not a subtype of '(String, AnyObject)'
if let weatherDictionary = dict["weather"] as? [AnyObject] {
Ich verstehe nicht, warum dict [ "wetter"] auf einen Subtyp (String, ANYOBJECT) und nicht ANYOBJECT verglichen wird.
Ich habe mein Wörterbuch als [String: AnyObject] deklariert, damit ich mit dem String-Schlüssel auf einen Wert zugreifen kann, sollte ich ein AnyObject haben, nein?
Wenn ich NSDictionary anstelle von [String: AnyObject] verwenden, funktioniert es.
Wenn ich NSArray anstelle von [AnyObject] verwenden, funktioniert es.
- The Xcode 6 beta 3 release notes tell that "NSDictionary* is now imported from Objective-C APIs as [NSObject : AnyObject].".
- And the Swift book: "When you bridge from an NSArray object to a Swift array, the resulting array is of type [AnyObject]."
EDIT
ich die dict zu zwingen, vergessen zu auspackt [ "wetter"] !.
if let dict = json as? [String: AnyObject] {
println(dict)
if let weatherDictionary = dict["weather"]! as? [AnyObject] {
println("\nWeather dictionary:\n\n\(weatherDictionary)")
if let descriptionString = weatherDictionary[0]["description"]! as? String {
println("\nDescription of the weather is: \(descriptionString)")
}
}
}
Beachten Sie, dass wir die Existenz des ersten Optional überprüfen sollten.
if let dict = json as? [String: AnyObject] {
for key in ["weather", "traffic"] {
if let dictValue = dict[key] {
if let subArray = dictValue as? [AnyObject] {
println(subArray[0])
}
} else {
println("Key '\(key)' not found")
}
}
}
Es sieht so aus, als ob der Compiler wirklich versucht, 'dict [" weather "]' als Aufruf von 'subscript (i: DictionaryIndex) -> (KeyType, ValueType) {get}' zu interpretieren Verwende '[AnyObject]'. Aber ich bin mir nicht sicher warum ... Vielleicht möchten Sie [einen Fehler melden] (http://bugreport.apple.com). –
jtbandes
Werfen Sie einen Blick auf: https://github.com/lingoer/SwiftyJSON –
Danke für Ihren Kommentar, aber ich versuche auch, den technischen Grund zu finden und zu verstehen, wie schnell funktioniert. Außerdem scheinen diese beiden Lösungen NSDictionary und NSArray zu verwenden, ich würde gerne Swift Collection-Typen verwenden. – alpennec