Swift相当于`initWithContentsOfFile:`?

时间:2014-06-10 16:13:55

标签: ios swift

我正在尝试在initWithContentsOfFile:上使用Swift等效的Array。文档说明等效项为convenience init(contentsOfFile aPath: String!)

我试图用以下代码调用它:

var path = NSBundle.mainBundle().pathForResource("Standards", ofType: "plist")
var rawStandards = Array<Dictionary<String, AnyObject?>>(contentsOfFile: path)

然而,编译器告诉我,它无法找到接受所提供参数的重载。我错过了什么?

4 个答案:

答案 0 :(得分:4)

@Leo Natan非常接近,但对我有用的方式是:

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数组。如果他的代码在将来的版本中有效,我不会感到惊讶。