0

嘿伙计们,我目前正在尝试遍历一个设置如下的 plist:

在此处输入图像描述

我正在使用的代码:

    letterPoints = NSDictionary(contentsOfFile: Bundle.main.path(forResource: "LetterPoints", ofType: "plist")!)

    for (myKey, myValue) in letterPoints {
        for (key, value) in myValue as NSDictionary {
            let x = value["Item 0"] as NSNumber
            let y = value["Item 1"] as NSNumber
            // lastPoint: CGPoint = CGPoint(x: x.integerValue, y: y.integerValue)
            println("x: \(x); y: \(y)")
        }
    }

但是我在循环的第一行遇到错误:for-in 循环需要'NSDictionary?符合“顺序”;你的意思是解开可选的吗?

使用swift从plist中的嵌套NSDictionary循环中获取代码,它似乎与我的结构化plist相同,所以我不确定它为什么不起作用。遍历我的 plist 的最佳方法是什么?

4

2 回答 2

2

首先,不要使用NSDictionary/NSArrayAPI 来读取 Swift 中的属性列表。

NSDictionary(contentsOfFile返回一个可选的,你必须打开它才能在循环中使用它,这就是错误告诉你的。

并且属性列表中没有字典,只有根对象。所有其他集合类型都是数组(在屏幕截图中明确说明)

强烈推荐在 Swift 中读取属性列表的 APIPropertyListSerialization甚至PropertyListDecoder是 Swift 4+

let url = Bundle.main.url(forResource: "LetterPoints", withExtension: "plist")!
let data = try! Data(contentsOf: url)
let letterPoints = try! PropertyListSerialization.propertyList(from: data, format: nil) as! [String:[[Int]]]
for (_, outerArray) in letterPoints {
    for innerArray in outerArray {
        let x = innerArray[0]
        let y = innerArray[1]
        print("x: \(x); y: \(y)")
    }
}

由于应用程序包中的属性列表是(不可变的)强制解包选项很好。如果代码崩溃,它揭示了一个可以立即修复的设计错误。

于 2020-05-19T17:31:24.550 回答
0

安全letterPoints展开if let

if let letterPoints = NSDictionary(contentsOfFile: Bundle.main.path(forResource: "LetterPoints", ofType: "plist")!) {
 // Use letterPoints in here
    for (myKey, myValue) in letterPoints {
        // Iterate in here
    }
}

请注意,您的迭代器似乎使用了错误的类型。您的 plist 看起来像是一个带有String键和[NSNumber]值的 NSDictionary。你会像这样迭代它:

if let letterPoints = NSDictionary(contentsOfFile: Bundle.main.path(forResource: "LetterPoints", ofType: "plist")!) as? [String: [NSNumber]] {
    for (_, myValue) in letterPoints {
        let x = myValue[0]
        let y = myValue[1]
        // lastPoint: CGPoint = CGPoint(x: x.integerValue, y: y.integerValue)
        print("x: \(x); y: \(y)")
    }
}
于 2020-04-13T00:53:16.957 回答