Swift无法解析NSMutableDictionary中的整数

时间:2015-08-21 01:21:01

标签: json swift

我有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显然包含整数,我如何解析整数

3 个答案:

答案 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”;
}

请注意,id1NSStringid2NSNumber,且没有引号""id3NSNumber的引号。

因为(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语言的多个功能来防止崩溃:

  1. 如果"id"不是user字典中的有效密钥,user["key"]将返回nil。使用nilString投射到as?将返回nil可选链 ?将返回nil而不是调用toInt(),最后 nil合并运算符 ??将将其转换为0
  2. 如果user["id"]实际上是另一种类型,那么as? String将返回nil,并且将会变为0,如上所述。
  3. 如果user["id"]String,而Int未转换为"two",如toInt(),那么nil将返回?? 0将转换为user["id"]
  4. 最后,如果String是转换为Int的{​​{1}},则toInt()将返回Int?(可选Int??将展开
  5. 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语言的多个功能来防止崩溃:

    1. 如果"id"不是user字典中的有效密钥,user["key"]将返回nil。使用nilString投射到as?将返回nil nil合并运算符 ??会将其转换为""Int("")将返回nil,其中第二个??将合并为0
    2. 如果user["id"]是另一种类型,那么as? String将返回nil,并且将成为0,如上所述。
    3. 如果user["id"]String而未转换为Int,则Int()将返回nil ??将转换为0user["id"]
    4. 最后,如果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.

Reference