我想将JSON解析为object,但我不知道如何将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?
// 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)"
}
表示字符串
答案 0 :(得分:40)
在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
}
答案 1 :(得分:5)
reminderJSON["id"]
会为您提供AnyObject?
,因此您无法将其投放到Int
您必须先解开它。
待办事项
self.id = reminderJSON["id"]! as Int
如果您确定JSON中会出现id
。
if id: AnyObject = reminderJSON["id"] {
self.id = id as Int
}
,否则
答案 2 :(得分:2)
现在你需要import foundation
。 Swift会将值type(String,int)
转换为对象types(NSString,NSNumber)
。由于AnyObject适用于所有对象,因此编译器不会投诉。
答案 3 :(得分:1)
这实际上非常简单,可以在一行中提取,投放和解包值: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")
}