Swift - 迭代一系列字典,同时从每个字典中检索一个值

时间:2015-07-14 17:51:52

标签: json swift

我正在使用返回字典数组的Web API。例如,它返回一个包含9个字典的数组,每个字典中都有一个名为“title”的键。

我已经尝试了以下代码,并且因为解开可选值时出错而崩溃:

for dict in returnedJson {

            if let validTitle = dict["title"] as? String {
                print(validTitle)
                dataList.append(validTitle)
            } else {
                print("Optional title?")
            }
        }

由于print(validTitle)行,标题列表会在控制台中打印出来,但我用来填充tableview的数组似乎不想附加它。

我知道这可能是一些非常基本的东西。

提前致谢!

3 个答案:

答案 0 :(得分:0)

您很可能将dataList定义为隐式解包的可选项。这就是为什么你在调用append时不需要使用可选链接但是如果dataList为nil,它仍然会抛出错误,因为它试图解包它。

答案 1 :(得分:0)

我有同样的问题: 1)确保dataList是NSMutableArray 2)在追加之前创建一个var类型的字符串 例如:

var recs:NSArray = jsonObj.objectForKey("pets")?.objectForKey("records") as! NSArray
for item in recs{
    var arr:NSArray = item as! NSArray
    var name:String = arr[1] as! String
    println(arr[2] as! String)
    self.recsAddr.addObject(name)
}

答案 2 :(得分:0)

我同意其他人的意见,我怀疑你使用的是一个隐式解包的可选,这个错误日志恰好是nil。我们需要更多代码。

一般来说,这种问题非常适合功能编程范例(因此受到Swift的喜爱),可以按照以下方式解决。

let returnedJson : [NSDictionary] = [["title":"one"], ["no title here":""], [:], ["title":"four"], ["title":"five"], ["title":"six"]]

let titles = returnedJson
    .map { return $0["title"] } // now we have a list of titles/nil [String?] 
    .filter { return $0 != nil} // now we have a list of titles (without nil)
    .map { return $0! } // now we have this return type [String]

titles // -> ["one", "four", "five", "six"]

希望这有帮助。