framework for development desarrollador cuenta apple app swift xcode6-beta6

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