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")
}