当前位置:  开发笔记 > Android > 正文

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

如何解决《Swift无法找到并读取属性列表(.plist)文件》经验,为你挑选了1个好方法。

我在使用一个简单的命令行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



1> matt..:

通常,这是你做的:

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

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

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有