Подтвердить что ты не робот

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, из AFOetworking responseObject):

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

Затем в классе Reminder я инициализирую его как это (напоминание как AnyObject, но это словарь (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 в таком случае?

//EDIT

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

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

для Int и

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

для строки

4b9b3361

Ответ 1

В Swift 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
}

Ответ 2

reminderJSON["id"] дает вам AnyObject?, поэтому вы не можете отдать его на Int Сначала вам нужно развернуть его.

Do

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

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

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

иначе

Ответ 3

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

Ответ 4

Это на самом деле довольно просто, значение может быть извлечено, заброшено и развернуто в одной строке: 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")
}