我有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
显然包含整数,我如何解析整数
答案 0 :(得分:2)
您不能相信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是NSString
id2是NSNumber
id3是NSNumber
print(user1)
{
id1 = 1;
id2 = 2;
id3 =“3.141592654”;
}
请注意,id1
是NSString
而id2
是NSNumber
,且没有引号""
。 id3
是NSNumber
的引号。
因为(user["id"] as? Int)!
给出错误:
无法将'__ NSCFString'类型的值(0x24807ac)转换为'NSNumber' (0x28d96dc)
基础类型为NSString
,有条件地将其转换为Int
后需要转换为String
:
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
。使用nil
将String
投射到as?
将返回nil
。 可选链 ?
将返回nil
而不是调用toInt()
,最后 nil合并运算符 ??
将将其转换为0
。user["id"]
实际上是另一种类型,那么as? String
将返回nil
,并且将会变为0
,如上所述。user["id"]
是String
,而Int
未转换为"two"
,如toInt()
,那么nil
将返回??
0
将转换为user["id"]
。String
是转换为Int
的{{1}},则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
。使用nil
将String
投射到as?
将返回nil
。 nil合并运算符 ??
会将其转换为""
。 Int("")
将返回nil
,其中第二个??
将合并为0
。user["id"]
是另一种类型,那么as? String
将返回nil
,并且将成为0
,如上所述。user["id"]
是String
而未转换为Int
,则Int()
将返回nil
??
将转换为0
到user["id"]
。String
是转换为Int
的{{1}},则Int()
将返回Int?
(可选Int
) ??
将解包。答案 1 :(得分:0)
NSDictionaries
不能包含整数 - 它们包含NSNumbers
。您必须将NSNumber
转换为int,它不会转换。
使用:
var intValue: Int32 { get }
或
var integerValue: Int { get }
答案 2 :(得分:0)
Swift 4:
self.id = user["id"].intValue
字符串的整数值,假设为十进制表示并在字符串的开头跳过空格。溢出时,此属性为INT_MAX或INT_MIN。如果字符串不以数字的有效十进制文本表示开头,则此属性为0.