我真的很困惑这个。网上有几十个问题要求"如何从Swift中的plist文件中获取信息?"到处都是相同的答案:
let path = NSBundle.mainBundle().pathForResource("Config", ofType: "plist")
但是,这行产生的总是为我生成nil
。我已将Config
替换为默认plist文件中的其他组件,但也获得了nil
。
我正在尝试访问我的自定义ProductIdentifiers
数组,如下所示:
let url = NSBundle.mainBundle().URLForResource("ProductIdentifiers", withExtension: "plist")!
var productArray = NSArray(contentsOfURL: url) as! [[String:AnyObject!]]
我在productArray上发生了fatal error: unexpectedly found nil while unwrapping an Optional value
的崩溃。我还尝试使用其他默认plist值代替ProductIdentifiers
。
有没有人知道为什么这对我不起作用,即使有很多人使用此帖成功?
答案 0 :(得分:3)
我以前从未听说过OP的方法。相反,您应该打开Info.plist
文件本身,然后从中提取值,如下所示:
func getInfoDictionary() -> [String: AnyObject]? {
guard let infoDictPath = Bundle.main.path(forResource: "Info", ofType: "plist") else { return nil }
return NSDictionary(contentsOfFile: infoDictPath) as? [String : AnyObject]
}
let productIdentifiers = getInfoDictionary()?["ProductIdentifiers"]
func getInfoDictionary() -> NSDictionary? {
guard let infoDictPath = NSBundle.mainBundle().pathForResource("Info", ofType: "plist") else { return nil }
return NSDictionary(contentsOfFile: infoDictPath)
}
let productIdentifiers = getInfoDictionary()?["ProductIdentifiers"]
答案 1 :(得分:1)
Resource
代表plist的文件名,而不是其内容。
plist的根对象可能是字典。
将MyPlist
替换为真实文件名。
此代码打印plist的内容
if let url = NSBundle.mainBundle().URLForResource("MyPlist", withExtension: "plist"),
root = NSDictionary(contentsOfURL: url) as? [String:AnyObject]
{
print(root)
} else {
print("Either the file does not exist or the root object is an array")
}