Je souhaite analyser un objet JSON en tant qu'objet, mais je ne sais pas comment convertir AnyObject en String ou Int depuis que je reçois:
0x106bf1d07: leaq 0x33130(%rip), %rax ; "Swift dynamic cast failure"
En utilisant par exemple:
self.id = reminderJSON["id"] as Int
J'ai la classe ResponseParser et à l'intérieur de celle-ci (responseReminders est un tableau de AnyObjects, de AFNetworking responseObject):
for reminder in responseReminders {
let newReminder = Reminder(reminderJSON: reminder)
...
}
Ensuite, dans la classe Reminder, je l'initialise comme ceci (rappel comme AnyObject, mais c'est Dictionary (String, AnyObject)):
var id: Int
var receiver: String
init(reminderJSON: AnyObject) {
self.id = reminderJSON["id"] as Int
self.receiver = reminderJSON["send_reminder_to"] as String
}
println(reminderJSON["id"])
le résultat est: facultatif (3065522)
Comment puis-je convertir AnyObject en String ou Int dans ce cas?
//MODIFIER
Après quelques essais, je viens avec cette solution:
if let id: AnyObject = reminderJSON["id"] {
self.id = Int(id as NSNumber)
}
pour Int et
if let tempReceiver: AnyObject = reminderJSON["send_reminder_to"] {
self.id = "\(tempReceiver)"
}
pour ficelle
Dans Swift, String
et Int
ne sont pas des objets. C'est pourquoi vous obtenez le message d'erreur. Vous devez transtyper en NSString
et NSNumber
qui sont des objets. Une fois que vous les avez, elles sont assignables à des variables du type String
et Int
.
Je recommande la syntaxe suivante:
if let id = reminderJSON["id"] as? NSNumber {
// If we get here, we know "id" exists in the dictionary, and we know that we
// got the type right.
self.id = id
}
if let receiver = reminderJSON["send_reminder_to"] as? NSString {
// If we get here, we know "send_reminder_to" exists in the dictionary, and we
// know we got the type right.
self.receiver = receiver
}
reminderJSON["id"]
vous donne un AnyObject?
, vous ne pouvez donc pas le convertir en Int
vous devez d'abord le dérouler.
Faire
self.id = reminderJSON["id"]! as Int
si vous êtes sûr que id
sera présent dans le JSON.
if id: AnyObject = reminderJSON["id"] {
self.id = id as Int
}
autrement
Maintenant, il vous suffit de import foundation
. Swift convertira la valeur type(String,int)
en objet types(NSString,NSNumber)
. Puisque AnyObject fonctionne avec tous les objets, le compilateur ne se plaindra plus.
C'est en fait assez simple, la valeur peut être extraite, convertie et décomposée en une seule ligne: if let s = d["2"] as? String
, un péché:
var d:[String:AnyObject] = [String:AnyObject]()
d["s"] = NSString(string: "string")
if let s = d["s"] as? String {
println("Converted NSString to native Swift type")
}