我正在尝试在initWithContentsOfFile:
上使用Swift等效的Array
。文档说明等效项为convenience init(contentsOfFile aPath: String!)
我试图用以下代码调用它:
var path = NSBundle.mainBundle().pathForResource("Standards", ofType: "plist")
var rawStandards = Array<Dictionary<String, AnyObject?>>(contentsOfFile: path)
然而,编译器告诉我,它无法找到接受所提供参数的重载。我错过了什么?
答案 0 :(得分:4)
var rawStandards = NSArray(contentsOfFile: path)
然后我可以访问元素:
for obj: AnyObject in rawStandards {
if var rawStandard = obj as? NSDictionary {
}
}
答案 1 :(得分:3)
您正在初始化一个Swift数组,而不是NSArray
,它具有initWithContentsOfFile:
初始化方法。
尝试:
var rawStandards = NSArray(contentsOfFile: path) as Dictionary<String, AnyObject?>[]
答案 2 :(得分:0)
var path = NSBundle.mainBundle().pathForResource("Standards", ofType: "plist")
var menuItemArray = NSArray(contentsOfFile: path) as NSArray!
这就是我自己使用的东西。在viewDidLoad
中答案 3 :(得分:0)
这对我有用。我已经在Xcode的beta版本中验证了它。与其他答案不同,我想要一个带有结果的原生类型Swift数组,所以我采取了一些额外的步骤。 (@ wayne-hartman的答案可能更直观,如果你不知道你的plist中有什么或者不想要一个类型化数组。)它确实需要以我没想到的方式强制类型。
我的plist在第一级有字典,在第二级有字符串,代码应该很容易为其他类型调整。
let plistNSArray = NSBundle.mainBundle().pathForResource("myplist", ofType: "plist")
let untypedArray: AnyObject[] = plistNSArray
let typedArray = untypedArray as Dictionary<String,String>[] //Obviously you could do this conditionally for better error handling
for plistDictItem in typedArray {
for (dictKey,dictValue) in plistDictItem {
println("key \(dictKey) has value \(dictValue)")
}
}
如果没有untypedArray
的中间步骤,它不起作用(或者至少我无法使其工作)。
@ leo-natan's不会为我编译,即使它看起来应该对我而言。我相信编译器无法在没有添加中间步骤的情况下直接将NSArray自动转换为类型化的Swift数组。如果他的代码在将来的版本中有效,我不会感到惊讶。