【问题标题】:Intricate access to dictionary key对字典键的复杂访问
【发布时间】:2016-03-28 13:30:02
【问题描述】:

我从服务器收到一个 JSON 字符串,然后我尝试通过这种方式将其转换为 NSDictionary:

let JSON = try NSJSONSerialization.JSONObjectWithData(rToData!, options:[])
guard let JSONDictionary:NSDictionary = (JSON as! NSDictionary) else {
print("My grandma is way more NSDictionary than this")
return
}

转换后,我尝试获取字典中包含的一些数据:特别是我需要一个可以通过这种方式访问​​的数组:

let myArray = JSONDictionary["data1"][0]["data2"];

XCode 真的不喜欢这个主意,它在第一个括号下放了一个箭头,并说 Value of optional type "AnyObject?"没有打开,你的意思是用“!”或者 ”?” ?。我按照它的建议插入“!”,将前面的代码转换为:

let myArray = JSONDictionary["data1"]![0]["data2"];

此时,以下行(我计算 data2 中元素的数量)显示错误,指出 AnyObject 没有成员 count

似乎唯一可以正常工作的是这个解决方案,但是除了丑陋和不可读之外,我真的不明白:

let myArray = (JSONDictionary["data1"]?[0]["data2"])!;

你能帮我理解为什么这种对字典中键的基本访问必须如此复杂吗?

我必须说我喜欢 Swift,但我花了很多时间处理可选选项和奇怪的 XCode 警报。

【问题讨论】:

    标签: ios swift nsarray nsdictionary


    【解决方案1】:

    无法保证您的 JSON 字典将包含键 data1 的值(好吧,您知道它会,但 Swift 不会)所以 JSONDictionary["data1"] 返回一个可选值。你需要用 ? 解开可选的?或者 !

    另外,由于你有一个 NSDictionary,而不是 Swift 字典,Swift 不知道值的类型,所以它们是 AnyObject。再说一遍,你知道它是一个数组,但 Swift 没有,所以你得到一个错误,指出 AnyObject 没有count 方法。

    虽然它更冗长,但如果将行拆分为多行,编译器和查看代码的任何其他人都会更清楚。它还可以让您向下转换各种对象,以便 Swift 知道发生了什么并处理任何格式错误的 JSON;

    if let array1 = JSONDictionary["data1"] as? NSArray {
       if let dictionary1 = array1[0] as? NSDictionary {
           if let data2Array = dictionary1["data2"] as? NSArray {
              let count=data2Array.count
           }
       }
    }
    

    您可以实现适当的 else 语句来处理错误

    Optional 是 Swift 最强大的功能之一。它们有助于避免与未初始化变量和边界条件的特殊标记值相关的一系列错误。重要的是您要了解他们如何帮助您,而不仅仅是扔?或者 !在你的代码,直到它编译。

    【讨论】:

    • 首先,感谢您的友好回复。我知道它们很强大,我会尝试更熟悉它们,但是当你没有时间并且周围压力很大时,它们真的很“阻塞”,所以你很容易最终暂时修复问题,遵循 XCode建议。当然,我完全知道这是错误的
    猜你喜欢
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2013-07-06
    • 2018-05-29
    • 1970-01-01
    • 2022-01-07
    相关资源
    最近更新 更多