swift - for - ios reference
Swift AnyObject no es convertible a String/Int (4)
Quiero analizar un JSON para objetar, pero no tengo idea de cómo convertir AnyObject en String o Int ya que estoy obteniendo:
0x106bf1d07: leaq 0x33130(%rip), %rax ; "Swift dynamic cast failure"
Cuando se utiliza, por ejemplo:
self.id = reminderJSON["id"] as Int
Tengo clase ResponseParser y dentro de ella (responseReminders es una matriz de AnyObjects, desde AFNetworking responseObject):
for reminder in responseReminders {
let newReminder = Reminder(reminderJSON: reminder)
...
}
Luego, en la clase Recordatorio, lo estoy inicializando así (el recordatorio como AnyObject, pero es 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"])
es: Opcional (3065522)
¿Cómo puedo downcast AnyObject a String o Int en caso de esto?
//EDITAR
Después de algunos intentos, vengo con esta solución:
if let id: AnyObject = reminderJSON["id"] {
self.id = Int(id as NSNumber)
}
para Int y
if let tempReceiver: AnyObject = reminderJSON["send_reminder_to"] {
self.id = "/(tempReceiver)"
}
para cuerda
Ahora solo necesita import foundation
. Swift convertirá el type(String,int)
valor type(String,int)
en types(NSString,NSNumber)
objeto types(NSString,NSNumber)
Dado que AnyObject funciona con todos los objetos, ahora el compilador no se queja.
En Swift, String
e Int
no son objetos. Es por eso que recibes el mensaje de error. Necesita convertir a NSString
y NSNumber
que son objetos. Una vez que los tenga, se los puede asignar a variables del tipo String
e Int
.
Recomiendo la siguiente sintaxis:
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
}
Esto es realmente bastante simple, el valor se puede extraer, convertir y desenvolver en una línea: if let s = d["2"] as? String
if let s = d["2"] as? String
, como en:
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")
}
reminderJSON["id"]
te da un AnyObject?
, por lo que no puedes convertirlo a Int
Tienes que desenvolverlo primero.
Hacer
self.id = reminderJSON["id"]! as Int
si está seguro de que la id
estará presente en el JSON.
if id: AnyObject = reminderJSON["id"] {
self.id = id as Int
}
de otra manera