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

标签 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);
    }

}

但是,一旦发生以下情况,程序就会因 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&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 文件的设置并以不同方式重新导入它。

如有任何帮助,我们将不胜感激!

非常感谢, 狂热

最佳答案

通常,这是你要做的:

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

但是你不能那样做,因为这是一个命令行程序。它是一个可执行文件,仅此而已。没有要复制到的包。你试图做的事情在形而上学上是不可能的。 😊

关于Swift 无法定位和读取属性列表 (.plist) 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34120518/

相关文章:

ios - 将 GMSMarker 移动 X 米偏转

ios - 更改 rootViewController 导致奇怪的行为

ios - 静态 UITableView 单元格内的动态 UITableView 数据源

ios - 使用 Xcode 6.1/Swift 以编程方式将图像设置为 UIImageView

ios - UIView 动画 shadowPath 不遵循

ios - 如何为 SWRevealViewController 立即调用 Selector?

ios - 如何解决将应用程序上传到 ios 中的应用程序商店时出现的问题

ios - 如何从Bundle获取PNG文件的资源路径?

ios - 有没有办法使用 Foursquare API 按价格搜索 field ?

swift - 观察员从未调用