35

我想将 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

4 回答 4

41

在 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
}
于 2014-09-01T12:47:53.033 回答
5

reminderJSON["id"]给你一个AnyObject?,所以你不能把它投射到Int你必须先打开它。

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

如果您确定它id会出现在 JSON 中。

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

除此以外

于 2014-08-22T14:48:01.720 回答
2

现在你只需要import Foundation. Swift 会将值转换type(String,int)为对象types(NSString,NSNumber)。由于 AnyObject 可以与所有对象一起使用,现在编译器不会抱怨。

于 2015-06-05T06:51:14.390 回答
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")
}
于 2015-07-09T20:44:33.603 回答