Ios plist文件出现奇怪错误

Ios plist文件出现奇怪错误,ios,swift,sprite-kit,plist,Ios,Swift,Sprite Kit,Plist,我有一个plist文件,我在其中添加了级别信息。它的设置如下:它有一个名为patterns的字典,然后它有一个名为1的数组,该数组包含n个项,这些项都是字典。这些项目有3个布尔值和3个数字。这是我读取该信息的代码: func readPlstForBlocks(){ let levelPlist = NSBundle.mainBundle().pathForResource("level\(levelToShow)", ofType: "plist") let leve

我有一个plist文件,我在其中添加了级别信息。它的设置如下:它有一个名为patterns的字典,然后它有一个名为1的数组,该数组包含n个项,这些项都是字典。这些项目有3个布尔值和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!)
    }
}
现在,行
让movingUpwards=item[“movingUpwards”]为!布尔
让movingSidewards=项目[“movingSidewards”]如图所示!布尔
让旋转=项目[“旋转”]为!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]]
现在,如果我们没有崩溃,斯威夫特知道,
firstPat
是一组字典,这比你之前讲的要多得多。这意味着firstPat中项目的
可以作为字典正确键入
项目。这反过来意味着您可以为其下标并按键提取值:

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

这些都不是“好”代码;强制铸造是危险的。在现实生活中,你应该在整个过程中安全地展开/铸造。但我认为这将为您提供一个更加连贯的方法。

请显示plist文件。给我们一些真实的数据玩吧!:)我刚刚添加了编辑和照片:)那里没有名为
“bool1”
的键!所以这就是你失败的原因。不,我只是为了这个问题而使用bool1,让它更一般。在我的原始代码中,我当然使用真名。我将编辑问题。你显示了错误代码???不要谎称你的代码是什么。嗯,我仍然认为我的答案是正确的。这就解释了你的错误
movingUpwards
是一个SKNode属性,因此在没有进一步信息的情况下,Swift假设这是一个SKNode。我可能会使用一系列可选绑定。Swift 1.2允许您指定多个绑定,其中下一个绑定依赖于上一个绑定。它使得代码非常紧凑且易于阅读。e、 g.
如果让a=NSDictionary b=a[“patterns”]c=b[“1”]
@duncac随意添加另一个答案来说明这一点。我不是想给他最后的密码;我只是想让他越过这个障碍。