plist文件的奇怪错误

strange error with plist file

我有一个 plist 文件,我在其中添加了关卡信息。它的设置如下:它有一个名为 patterns 的字典,然后它有一个名为 1 的数组,该数组包含 n 项,它们都是字典。这些项目有 3 个布尔值和三个数字。这是我阅读该信息的代码:

    func readPlstForBlocks(){

    let levelPlist = NSBundle.mainBundle().pathForResource("level\(levelToShow)", ofType: "plist")
    let levelData = NSDictionary(contentsOfFile: levelPlist!) as NSDictionary!
    let patterns = levelData["patterns"] as! NSDictionary
    let firstPat = patterns["1"] as! NSArray
    for item in firstPat {
        let i = item["x"]?!.floatValue
        let j = item["y"]?!.floatValue
        let movingUpwards = item["movingUpwards"] as! Bool
        let movingSidewards = item["movingSidewards"] as! Bool
        let spinning = item["spinning"] as! Bool
        let typ = item["type"]?!.floatValue
        let type = Int16(typ!)
        let posx = CGFloat(i!)
        let posy = CGFloat(j!)
    }
}

现在 let movingUpwards = item["movingUpwards"] as! Bool let movingSidewards = item["movingSidewards"] as! Bool let spinning = item["spinning"] as! Bool 行给了我一个奇怪的错误,说我正在从 SKNode 转换为 bool 并且它总是失败。这完全让我感到困惑,因为我已经多次使用类似代码从其他 plist 访问布尔值并且它似乎工作得很好,其次,为什么 xcode 会认为它是 SKNode?任何人都知道如何解决这个问题?

编辑:

我正在添加 plist 文件照片:

一般来说,在写Swift代码的时候,我会推荐尽量使用Swift类型,而不是Objective-C类型。所以,你在哪里有这个:

let levelData = NSDictionary(contentsOfFile: levelPlist!) as NSDictionary!
let patterns = levelData["patterns"] as! NSDictionary
let firstPat = patterns["1"] as! NSArray

我会这样写:

let levelData = NSDictionary(contentsOfFile: levelPlist!) as! [NSObject:AnyObject]
let patterns = levelData["patterns"] as! [NSObject:AnyObject]
let firstPat = patterns["1"] as! [[NSObject:AnyObject]]

现在,如果我们在没有崩溃的情况下走到这一步,Swift 知道 firstPat 是一个 字典数组 ,这比你原来的要多得多告诉它之前。这意味着 for item in firstPat 可以正确键入 item 作为字典。反过来,这意味着您可以为其下标并按键提取值:

for item in firstPat {
    let i = item["x"] as! Float
    let j = item["y"] as! Float
    let movingUpwards = item["movingUpwards"] as! Bool
    // ...
}
其中

None是"good"码;强制演员表很危险。在现实生活中,您应该一直安全地展开/投射。但我认为这会给你一个更连贯的方法。