如何在swift中搜索字典时使用可选链接?

我想安全地搜索
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)
    }
}

在我看来,更容易阅读,没有不必要的缩进

点赞