Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json Swift-迭代一组字典,同时从每个字典中检索一个值_Json_Swift - Fatal编程技术网

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

Json Swift-迭代一组字典,同时从每个字典中检索一个值,json,swift,Json,Swift,我使用的是一个返回字典数组的web API。例如,它返回一个包含9个字典的数组,每个字典中都有一个名为“title”的键 我尝试了以下代码,它崩溃了,出现了一个打开可选值的错误: for dict in returnedJson { if let validTitle = dict["title"] as? String { print(validTitle) dataList.append(validTi

我使用的是一个返回字典数组的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的数组似乎不想附加它

我知道这可能是我一直在逃避的一件很基本的事情


提前谢谢

您很可能已将
dataList
定义为隐式展开的可选项。这就是为什么在调用append时不需要使用可选链接的原因,但是如果
数据列表
为零,它仍然会抛出一个错误,因为它正试图打开它。

我遇到了同样的问题: 1) 确保dataList是NSMutableArray 2) 在追加之前创建字符串类型的变量 例如:

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)
}

我同意其他人的看法,对于错误日志,我怀疑您正在使用一个隐式展开的可选项,该可选项恰好为零。我们需要更多的代码

一般来说,这类问题非常适合函数式编程范式(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"]

希望这有帮助。

是否初始化数据列表?崩溃在哪里?什么是展开的可选?我们需要看到更多的代码。具体来说,我们需要了解如何定义
dataList
。另外,在您的代码示例中没有强制展开,因此展开可选错误到底发生在哪里?OP的JSON反序列化为字典,而不是数组。此外,OP似乎使用的是Swift数组和字典,而不是对应的Cocoa。最后,所有的
as强制降级只会导致运行时错误,尤其是在处理来自远程服务器的JSON对象时,您无法保证接收到的数据的结构。谢谢大家。是的,在初始化数据列表时犯了一个愚蠢的错误(我还在学习)。我感谢大家的反馈,并将研究函数式编程范例appzyourlyfe