我有 NSDictionary 打印描述为
{
accStatus = 2;
accessKey = "55d66e4d4f740-c24aa8ef3a28564db5a2bf77c8638478-712675299";
email = "abc@yahoo.com";
id = 15;
imagePath = "";
name = "Umar";
notifStatus = 0;
phone = 923217268138;
}
我正在尝试按照以下代码进行解析
init (user: AnyObject)
{
self.id = (user["id"] as? Int) ?? 0
self.accStatus = (user["accStatus"] as AnyObject? as? Int) ?? 0
self.accessKey = (user["accessKey"] as AnyObject? as? String) ?? "" // to get rid of null
self.name = (user["name"] as AnyObject? as? String) ?? "" // to get rid of null
}
然而它对所有整数返回 0。如果我尝试删除条件 ??并替换为!它给我错误
Could not cast value of type '__NSCFString' (0x24807ac) to 'NSNumber' (0x28d96dc).
AnyObject NSMutableDictionary
明明是整数,我怎么解析整数
最佳答案
您不能信任 print
来揭示字典中值的类型。考虑这个例子:
var user1: NSMutableDictionary = [
"id1" : "1",
"id2" : 2,
"id3" : 3.141592654
]
for (key, value) in user1 {
var type: String
switch value {
case let i as NSNumber:
type = "NSNumber"
case let s as NSString:
type = "NSString"
default:
type = "something else"
}
print("\(key) is \(type)")
}
id1 is NSString
id2 is NSNumber
id3 is NSNumber
print(user1)
{
id1 = 1;
id2 = 2;
id3 = "3.141592654";
}
注意 id1
是一个 NSString
而 id2
是一个 NSNumber
并且都没有引号 “”
。 id3
是一个 NSNumber
,带有引号。
因为 (user["id"] as? Int)!
给出错误:
Could not cast value of type '__NSCFString' (0x24807ac) to 'NSNumber' (0x28d96dc)
底层类型是 NSString
,在有条件地将它们转换为 String
之后需要将其转换为 Int
:
对于 Swift 1.2:
self.id = (user["id"] as? String)?.toInt() ?? 0
self.accStatus = (user["accStatus"] as? String)?.toInt() ?? 0
self.accessKey = (user["accessKey"] as? String) ?? ""
self.name = (user["name"] as? String) ?? ""
请注意 (user["id"] as?String)?.toInt() ?? 0
使用 Swift 语言的多项功能来防止崩溃:
- 如果
"id"
不是user
字典中的有效键,user["key"]
将返回nil
。使用as?
将nil
转换为String
将返回nil
。 可选链?
将只返回nil
而不是调用toInt()
最后 nil 合并operator??
会将其转换为0
。 - 如果
user["id"]
实际上是另一种类型,那么as? String
将返回nil
并且将变为0
如上所述。 - 如果
user["id"]
是一个String
,它不会转换为Int
,例如"two"
,然后toInt()
将返回nil
,其中??
将转换为0
。< - 最后,如果
user["id"]
是转换为Int
的String
,则toInt()
将返回Int?
(可选Int
),??
将解包
对于 Swift 2.0:
self.id = Int(user["id"] as? String ?? "") ?? 0
self.accStatus = Int(user["accStatus"] as? String ?? "") ?? 0
像上面的 Int(user["id"] as?String ?? "") ?? 0
使用 Swift 语言的多项功能来防止崩溃:
- 如果
"id"
不是user
字典中的有效键,user["key"]
将返回nil
。使用as?
将nil
转换为String
将返回nil
。 nil 合并运算符??
会将其转换为""
。Int("")
将返回nil
,第二个??
将合并为0
。 - 如果
user["id"]
是另一种类型,那么as? String
将返回nil
并且将变为0
如上所述。 - 如果
user["id"]
是一个String
而不是一个Int
,那么Int()
将返回nil
,??
将转换为0
。 - 最后,如果
user["id"]
是转换为Int
的String
,则Int()
将返回Int?
(可选Int
),??
将解包。
关于json - Swift 无法解析 NSMutableDictionary 中的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32130952/