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)"
}
для строки
Ответы
Ответ 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")
}