Swift无法找到并读取属性列表(.plist)文件

时间:2015-12-06 17:38:28

标签: swift

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

}

然而,程序失败后会发生致命错误:

 let productArray = NSArray(contentsOfFile: path!)
到达

行,输出:

文件位置: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>

我已经尝试了我能想到的一切,包括查看.plist文件的设置并以不同的方式重新导入它。

非常感谢任何帮助!

非常感谢, Kwangle

2 个答案:

答案 0 :(得分:8)

通常,这就是你所做的:

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

但你不能这样做,因为这是一个命令行程序。它是一个可执行文件而已。没有要复制的包。你想要做的是形而上学不可能的。

答案 1 :(得分:2)

  

在Swift 3.0中

获取.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
}

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

  let plistPath = self.getPath()
        if FileManager.default.fileExists(atPath: plistPath) {
           //fileName.plist Found
        }