gpt4 book ai didi

json - Swift 无法解析 NSMutableDictionary 中的整数

转载 作者:搜寻专家 更新时间:2023-11-01 07:31:54 24 4
gpt4 key购买 nike

我有 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 是一个 NSStringid2 是一个 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 语言的多项功能来防止崩溃:

  1. 如果 "id" 不是 user 字典中的有效键,user["key"] 将返回 nil 。使用 as?nil 转换为 String 将返回 nil可选链 ? 将只返回 nil 而不是调用 toInt() 最后 nil 合并operator ?? 会将其转换为 0
  2. 如果 user["id"] 实际上是另一种类型,那么 as? String 将返回 nil 并且将变为 0 如上所述。
  3. 如果 user["id"] 是一个 String,它不会转换为 Int,例如 "two",然后 toInt() 将返回 nil,其中 ?? 将转换为 0。<
  4. 最后,如果 user["id"] 是转换为 IntString,则 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 语言的多项功能来防止崩溃:

  1. 如果 "id" 不是 user 字典中的有效键,user["key"] 将返回 nil 。使用 as?nil 转换为 String 将返回 nilnil 合并运算符 ?? 会将其转换为 ""Int("") 将返回 nil,第二个 ?? 将合并为 0
  2. 如果 user["id"] 是另一种类型,那么 as? String 将返回 nil 并且将变为 0 如上所述。
  3. 如果 user["id"] 是一个 String 而不是一个 Int,那么 Int() 将返回 nil?? 将转换为 0
  4. 最后,如果 user["id"] 是转换为 IntString,则 Int() 将返回 Int?(可选 Int),?? 将解包。

关于json - Swift 无法解析 NSMutableDictionary 中的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32130952/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com