我在使用一个简单的命令行OSX Swift程序从一个简单的.plist XML文件中读取数据时遇到了一个真正的问题 - 实际上程序甚至看不到该文件,尽管它看似存在并被复制到bundle中.
数据由一个类处理,该类用于读取并将plist数据复制到一个数组中,在该数组中可以检索它而不需要再次查询plist:
// Datadump.swift import Foundation class Datadump { //array of dictionaries containing string keys and any datatype of value var dataArray : Array> init () { //copies data from plist let bundle = NSBundle.mainBundle() let path = bundle.pathForResource("Hardware", ofType: "plist") //check file located print("File Location: \(path) " ) let productArray = NSArray(contentsOfFile: path!) dataArray = productArray as! Array > } //returns tuple based on product id func getData(prodId: Int) -> (String, Int) { //returned vars var price = 0 var name : String = "" //iterate through array until relevant product is found for dict in dataArray{ if dict["ProdId"] as! Int == prodId{ price = dict["Price"] as! Int name = dict["Name"] as! String break } } return (name, price); } }
但是,程序一旦失败就会出现致命错误:
let productArray = NSArray(contentsOfFile: path!)
到达行,输出:
文件位置:nil致命错误:在展开Optional值时意外发现nil
print语句确认程序找不到Hardware.plist文件.
主程序只是创建类的实例并运行一个函数,但是一旦类的init()运行如上所述,它就会明显失败:
// main.swift import Foundation //creates instance of Datadump class var myData = Datadump () //queries data, copies result to tuple let (nam, pri) = myData.getData(123) print ("Name: \(nam) Price: \(pri)")
Hardware.plist文件如下所示:
Name Intel i7 CPU Price 13995 ProdId 123 Name 19" Monitor Price 9995 ProdId 456 Name 8GB DDR Ram Price 4595 ProdId 789
我已经尝试了我能想到的一切,包括查看.plist文件的设置并以不同的方式重新导入它.
任何帮助将不胜感激!
非常感谢Kwangle
通常,这是你做的:
在Project Navigator(左侧)中,选择plist文件.在文件检查器(右侧)中,检查目标成员资格设置.您可能会发现未检查应用目标.这意味着在构建plist文件时,plist文件不会被复制到应用程序包中.检查应用目标,一切都会好的.
但你不能这样做,因为这是一个命令行程序.它是一个可执行文件而已.没有要复制的包.你想要做的是形而上学不可能的.