web-dev-qa-db-fra.com

Swift AnyObject n'est pas convertible en chaîne / int

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

34
pJes2

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
}
40
vacawama

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

5
Gabriele Petronella

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.

2
jishnu bala

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")
}
1
Chris Conover