我有一个我想在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)
答案 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
}