Swift无法定位和读取属性列表(.plist)文件

Swift无法定位和读取属性列表(.plist)文件,swift,Swift,在让一个简单的命令行OSX Swift程序从一个简单的.plist XML文件读取数据时,我遇到了一个真正的问题——事实上,该程序甚至看不到该文件,尽管它似乎存在并复制到了包中 数据由一个类处理,该类用于将plist数据读取并复制到一个数组中,在该数组中可以检索数据,而无需再次查询plist: // Datadump.swift import Foundation class Datadump { //array of dictionaries containing string

在让一个简单的命令行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);
    }

}
到达第行时,输出:

文件位置:nil致命错误:在展开可选值时意外发现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文件如下所示:

<?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&quot; 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>

名称
英特尔i7处理器
价格
13995
普罗迪德
123
名称
19英寸显示器
价格
9995
普罗迪德
456
名称
8GB DDR Ram
价格
4595
普罗迪德
789
我已经尝试了我能想到的一切,包括查看.plist文件的设置并以不同的方式重新导入它

任何帮助都将不胜感激

非常感谢,,
Kwangle

通常情况下,您会这样做:

在项目导航器(左侧)中,选择plist文件。在文件检查器(右侧)中,检查目标成员资格设置。您可能会发现应用程序目标未被选中。这意味着在您构建应用程序包时,plist文件未被复制到应用程序包中。检查应用程序目标,一切都会正常

但你不能这样做,因为这是一个命令行程序。它是一个可执行文件,没有其他文件。没有可复制的包。你试图做的是形而上学上不可能的。 在Swift 3.0中

Get.plist路径

检查文档目录中是否存在.plist文件


“尽管它似乎存在并复制到捆绑包中”,但没有“似乎””“是吗?我打赌不是这样。你可以打开内置的应用程序并直接查看它,你知道。它在文件导航器中可见,我使用了“添加文件”功能并直接将其拖动到项目窗口中。我该如何最终检查这一点?感谢您的帮助。“我使用了“添加文件”功能并直接将其拖动到项目窗口”,将其添加到项目中,但不一定将其添加到应用程序目标中。以下是指向文件列表屏幕抓取的链接:如何将.plist文件正确添加到应用程序中?尽管进行了数小时的研究和实验,我还是找不到任何关于如何做到这一点的信息。谢谢你的帮助。将我的答案与屏幕截图进行比较:是的,但应用程序复选框变灰了,无法选中。这是plist文件信息的屏幕抓图,请注意不能更改的变灰复选框:哇,@Kwangle,我以前从未见过。然而,我说的是对的;您必须选中该复选框,否则在您构建应用程序时,文件不会被复制到应用程序中。我建议您从一个全新的文件开始:在Xcode中创建一个空白文本文件,并将plist内容复制到其中,也许吧。我知道。这快把我逼疯了。似乎这是我缺少的基本信息,或者是需要正确设置的设置。我认为这可能是因为该应用程序是一个命令行程序(可能与.plist文件不兼容),但我认为情况并非如此。我真的被难住了,因为这是我第二次发布关于这个的帖子,但没有成功,我觉得它真的很奇怪。大概在文本编辑器中编写XML文件并在程序之间复制它们是正常的。非常感谢您的关注。那么我们必须将plist存储在哪里才能使用它呢?用户/文档?这管用!但如何将其应用到生产代码中呢?文件系统编程指南和
FileManager
?我想在文档(或其他地方)中创建一个文件夹来存储每个项目的plists。
<?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&quot; 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>
func getPath() -> String {
        let plistFileName = "fileName.plist"
        let paths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        let documentPath = paths[0] as NSString
        let plistPath = documentPath.appendingPathComponent(plistFileName)
        return plistPath
}
  let plistPath = self.getPath()
        if FileManager.default.fileExists(atPath: plistPath) {
           //fileName.plist Found
        }