我在让一个简单的命令行 OSX Swift 程序从一个简单的 .plist XML 文件中读取数据时遇到了一个真正的问题——事实上,该程序甚至看不到该文件,尽管它看似存在并被复制到捆绑。
数据由一个类处理,该类用于读取 plist 数据并将其复制到数组中,无需再次查询 plist 即可检索数据:
// Datadump.swift
import Foundation
class Datadump {
//array of dictionaries containing string keys and any datatype of value
var dataArray : Array<Dictionary<String,AnyObject>>
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<Dictionary<String,AnyObject>>
}
//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);
}
}
但是,一旦发生以下情况,程序就会因 fatal error 而失败:
let productArray = NSArray(contentsOfFile: path!)
到达行,输出:
文件位置:nil fatal error :在展开可选值时意外发现 nil
打印语句确认程序找不到 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 文件如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
<dict>
<key>Name</key>
<string>Intel i7 CPU</string>
<key>Price</key>
<integer>13995</integer>
<key>ProdId</key>
<integer>123</integer>
</dict>
<dict>
<key>Name</key>
<string>19" Monitor</string>
<key>Price</key>
<integer>9995</integer>
<key>ProdId</key>
<integer>456</integer>
</dict>
<dict>
<key>Name</key>
<string>8GB DDR Ram</string>
<key>Price</key>
<integer>4595</integer>
<key>ProdId</key>
<integer>789</integer>
</dict>
</array>
</plist>
我已经尝试了所有我能想到的方法,包括查看 .plist 文件的设置并以不同方式重新导入它。
如有任何帮助,我们将不胜感激!
非常感谢, 狂热
最佳答案
通常,这是你要做的:
在项目导航器(左侧)中,选择 plist 文件。在文件检查器(右侧)中,检查目标成员资格设置。您可能会发现应用目标未被选中。这意味着当您构建它时,plist 文件不会被复制到应用程序包中。检查应用程序目标,一切都会好起来的。
但是你不能那样做,因为这是一个命令行程序。它是一个可执行文件,仅此而已。没有要复制到的包。你试图做的事情在形而上学上是不可能的。 😊
关于Swift 无法定位和读取属性列表 (.plist) 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34120518/