Swift AnyObject не конвертируется в String/Int

Я хочу проанализировать JSON для объекта, но я не знаю, как привести AnyObject к String или Int, так как я получаю:

0x106bf1d07:  leaq   0x33130(%rip), %rax       ; "Swift dynamic cast failure"

При использовании, например:

self.id = reminderJSON["id"] as Int

У меня есть класс ResponseParser и внутри него (responseReminders является массивом AnyObjects, из AFNetworking responseObject):

for reminder in responseReminders {
    let newReminder = Reminder(reminderJSON: reminder)
        ...
}

Затем в классе Reminder я инициализирую его следующим образом (напоминание как AnyObject, но это 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"]) Результат: Необязательно (3065522)

Как я могу понизить AnyObject до String или Int в случае, как это?

//РЕДАКТИРОВАТЬ

После некоторых попыток я пришел с этим решением:

if let id: AnyObject = reminderJSON["id"] { 
    self.id = Int(id as NSNumber) 
} 

для Int и

if let tempReceiver: AnyObject = reminderJSON["send_reminder_to"] { 
    self.id = "\(tempReceiver)" 
} 

для строки

4 ответа

Решение

В Свифте String а также Int не объекты. Вот почему вы получаете сообщение об ошибке. Вы должны бросить на NSString а также NSNumber которые являются объектами. Как только они у вас есть, они могут быть назначены переменным типа String а также Int,

Я рекомендую следующий синтаксис:

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"] дает вам AnyObject?так что вы не можете бросить его на Int Вы должны сначала развернуть его.

Делать

self.id = reminderJSON["id"]! as Int

если ты уверен что id будет присутствовать в JSON.

if id: AnyObject = reminderJSON["id"] {
    self.id = id as Int
}

иначе

Теперь вам просто нужно import foundation, Swift преобразует значение type(String,int) в объект types(NSString,NSNumber)Так как AnyObject работает со всеми объектами, теперь компилятор не будет жаловаться.

Это на самом деле довольно просто, значение может быть извлечено, приведено и развернуто в одну строку: if let s = d["2"] as? String, как в:

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")
}
Другие вопросы по тегам