【问题标题】:Swift - iterate array of dictionariesSwift - 迭代字典数组
【发布时间】:2014-09-12 13:35:17
【问题描述】:

试图找到每本书的标题:

var error: NSError?
    let path = NSBundle.mainBundle().pathForResource("books", ofType: "json")
    let jsonData = NSData.dataWithContentsOfFile(path, options: .DataReadingMappedIfSafe, error: nil)
    let jsonDict = NSJSONSerialization.JSONObjectWithData(jsonData, options: nil, error: &error) as NSDictionary
    let books = jsonDict["book"]

    var bookTitles:[String]

    //for bookDict:Dictionary in books {
    //    println("title: \(bookDict["title"])")
    //}

当我取消对最后三行的注释时,Xcode6 beta3 中的一切都乱了套——所有文本都变白了,我得到不断的“SourceKitService Terminated”和“Editor functionality暂时受限”弹出窗口,并且我得到了这些有用的构建错误:

<unknown>:0: error: unable to execute command: Segmentation fault: 11
<unknown>:0: error: swift frontend command failed due to signal

我在这里严重得罪了编译器。那么遍历字典数组并找到每个字典的“title”属性的正确方法是什么?

【问题讨论】:

  • 不要忽略错误返回,专业要求处理错误路径。
  • println()jsonDatajsonDictbooks。将错误变量添加到 NSData.dataWithContentsOfFile。如果有错误,请检查返回值和println() 任何错误变量。并不是说println() 足以处理错误。深入使用调试器也是一个有用的调试过程。

标签: ios arrays json dictionary swift


【解决方案1】:

您遇到了问题,因为 Swift 无法推断 books 是可迭代类型。如果你知道数组的类型,你应该明确地转换为这种类型。例如,如果数组应该是一个字典数组,其中包含字符串作为对象和键,您应该执行以下操作。

if let books = jsonDict["book"] as? [[String:String]] {
    for bookDict in books {
        let title = bookDict["title"]
        println("title: \(title)")
    }
}

还请注意,您必须从字符串插值中删除下标字典访问,因为它包含引号。您只需要分两行完成。

【讨论】:

  • 谢谢,这很有帮助。如果字典有一些对象是 String:String 和一些是 String:Array 怎么办?例如,在这种情况下,书本词典可能包含一个“章节”键,其中包含章节词典数组。
  • @soleil 在这种情况下,您可能想要使用 [[String:AnyObject]]。当然,这意味着您必须重复 if let... 以检查您当前正在处理的情况。
  • 如果它对其他人有帮助,[[String:String]] 位表示“书籍(可能)是一个字典数组,其中键和值都是字符串”或这种格式更我熟悉:Array>
猜你喜欢
  • 2015-10-03
  • 1970-01-01
  • 2017-10-29
  • 2018-09-04
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 2016-11-17
  • 1970-01-01
相关资源
最近更新 更多