我想安全地搜索
swift Dictionary中的值,使用if并确保它是类型安全的,因为我越来越深入到字典中.该字典包含包含NSArray的字典,其中包含更多字典.
首次尝试我的代码如下所示:
if let kkbox = ticket["KKBOX"] as? Dictionary<String, AnyObject> {
if let kkboxDlUrlDict = kkbox["kkbox_dl_url_list"] as? Dictionary<String, AnyObject> {
if let kkboxDlUrlArray = kkboxDlUrlDict["kkbox_dl_url"] as? NSArray {
for dict in kkboxDlUrlArray {
if let name = dict["name"] as? String {
if name == mediaType.rawValue {
urlStr = dict["url"] as String
}
}
}
} else { return nil }
} else { return nil }
} else { return nil }
如何将其缩短为一行或两行?
我意识到如果它是2层,我可以链接它.这有效:
if let kkboxDlUrlArray = ticket["KKBOX"]?["kkbox_dl_url_list"] as? NSArray {
}
但任何比这更长的链,都不会编译.
有没有办法不止一次链接字典?
谢谢
最佳答案 你可以链接,但在每一步都有适当的向下倾斜:
if let kkboxDlUrlArray = ((((ticket["KKBOX"] as? Dictionary<String, AnyObject>)?["kkbox_dl_url_list"]) as? Dictionary<String, AnyObject>)?["kkbox_dl_url"]) as? NSArray {
for dict in kkboxDlUrlArray {
println(dict)
}
}
虽然这看起来不太好 – 它只是一行,但不可读.
就个人而言,没有使用任何花哨的功能方式,我只需要一个可选的绑定就可以使链更明确:
let kkbox = ticket["KKBOX"] as? Dictionary<String, AnyObject>
let kkboxDlUrlDict = kkbox?["kkbox_dl_url_list"] as? Dictionary<String, AnyObject>
if let kkboxDlUrlArray = kkboxDlUrlDict?["kkbox_dl_url"] as? NSArray {
for dict in kkboxDlUrlArray {
println(dict)
}
}
在我看来,更容易阅读,没有不必要的缩进