访问Swift中的plist(错误:“顶层不允许表达式”)

时间:2014-06-20 20:26:02

标签: ios xcode swift ios8

我有一个我想在Xcode中作为Swift词典访问的plist。我能够将文件的内容定义为NSDictionary,但每次我尝试从中访问特定的值/对象时,都会显示错误“顶层不允许表达式”。我已尝试使用自动完成的括号表示法,类型转换和类方法(带点符号)。

我的plist包含字典,其中包含包含带有CGFloats和字符串的字典的字典。

我想访问实例的值。

这是我用来定义它的代码,它位于我的GameScene.swift的开头(它是一个SpriteKit游戏):

let levelBlocks = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("LevelBlocks", ofType: "plist"))

我希望能够做到:

levelBlocks["Level1"]

编辑:添加了更多信息。

我也尝试将它放在ViewDidLoad(),init()中,并使用符合Hashable内部的泛型而不是AnyObject / Any。我仍然无法访问String。

编辑2:我在ViewDidLoad()中尝试了这个,它返回错误254:

let levelBlocks = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("LevelBlocks", ofType: "plist")) as Dictionary<String, Dictionary<String, Dictionary<String, String>>>
let test = levelBlocks["Level1"] as Dictionary<String, Dictionary<String, String>>
let test1 = test["Block0"] as Dictionary<String, String>
let test2 = test1["color"] as String
println(test2)

2 个答案:

答案 0 :(得分:1)

这是我找到的解决方案:

let levelBlocks = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("LevelBlocks", ofType: "plist"))
let test: AnyObject = levelBlocks.objectForKey("Level1")
println(test) // Prints the value of test

我将test的类型设置为AnyObject,以消除可能发生意外推断的警告。

此外,它必须在类方法中完成。

访问并保存已知类型的特定值:

let value = levelBlocks.objectForKey("Level1").objectForKey("amount") as Int
println(toString(value)) // Converts value to String and prints it

答案 1 :(得分:0)

当您在类或实例方法之外使用表达式时,Xcode会给出该错误。声明像levelBlocks这样的全局变量是可以的,但尝试在变量上调用方法(这是下标所做的)是一个表达式,不允许在那里。如果您只是测试一下,可以创建另一个全局:

let levelBlocks = NSDictionary(contentsOfFile: NSBundle.mainBundle().pathForResource("LevelBlocks", ofType: "plist"))
let level1 = levelBlocks["level1"]

但实际上任何类型的操作都应该发生在你的课堂内。

注意:这适用于&#34; .swift&#34;文件 - 游乐场是为这种非正式实验而构建的。您尝试的代码是否在游乐场中运行?


这里是一个Swift文件的细分,其中包含一个具有不同级别范围的类,注释如下:

// MyViewController.swift

let globalNumber = 10           // global scope: can be accessed from 
                                // anywhere in this module.

class MyViewController : ViewController {
    var instanceNumber = 5      // instance scope: instances of this class each
                                // maintain their own value. should be
                                // accessed within methods using self.varname

    override func viewDidLoad() {
        super.viewDidLoad()

        var localNumber = self.instanceNumber * globalNumber
                                // local scope: will disappear after this method
                                // finishes executing (in most cases)
    }
}

在您的情况下,您希望加载plist并在其中一个类中访问其值,可能是init...DidLoad方法。

至于从字典中提取项目,请记住,NSDictionary作为Dictionary直接桥接到Swift,因此您可以像这样加载和解析它:

let path = NSBundle.mainBundle().pathForResource("LevelBlocks", ofType: "plist")
if let levelBlocks = NSDictionary(contentsOfFile: path) as? Dictionary<String, AnyObject> {
    let level1 = levelBlocks["level1"]                    // level1 is of type AnyObject?
    let level2 = levelBlocks["level2"] as NSString        // type NSString
    let level3: String = levelBlocks["level3"] as NSString     // type String
}