用Swift将.plist数据读入字典



我在将plist文件中的XML数据读取到字典中时遇到问题。问题包括plist没有被识别为捆绑包的一部分,尽管在导入时检查了将其添加到项目中的正确选项。

我正在寻找一种简单的方法,在程序启动时读取数据,然后通过访问数组的方法轻松获得数据。数据不需要重写或更改,因此程序运行只需要一次传输。

以下是.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>19” HD Monitor</string>
        <key>Price</key>
        <integer>11999</integer>
        <key>ProdId</key>
        <integer>123</integer>
    </dict>
    <dict>
        <key>Name</key>
        <string>4GB RAM Module</string>
        <key>Price</key>
        <integer>2995</integer>
        <key>ProdId</key>
        <integer>456</integer>
    </dict>
    <dict>
        <key>Name</key>
        <string>Samsung 256GB SSD</string>
        <key>Price</key>
        <integer>11250</integer>
        <key>ProdId</key>
        <integer>789</integer>
    </dict>
</array>
</plist>

数据包括一个产品名称(String)、以便士或美分为单位的价格(Int)和一个唯一的产品ID(Int)。它们的关键字名称分别是"名称"、"价格"one_answers"ProdID"。

这是我用来读取中数据的代码。我使用一个简单的命令行程序以一种简单的形式隔离此操作,并通过测试来查看数据是否已存储和从字典中检索。数据操作将在一个类别中提供:

//
//  Datadump.swift
//  PListTester
//
//  Created by Kwangle on 30/11/2015.
//  Copyright (c) 2015 KwangCo All rights reserved.
//
import Foundation

class Datadump {

    //declare container array
    var dictArray: Array<Dictionary<String,AnyObject>>
    //reads data when class is constructed
    init () {
        let bundle = NSBundle(forClass: Datadump.self)
        //gets file location of 'Products.plist' from bundle
        let fileLocation = bundle.pathForResource("Hardware", ofType: "plist")
        //creates NSArray from contents of 'Hardware.plist'
        let productArray = NSArray(contentsOfFile: fileLocation!)
        //creates dictionary array from NSArray via force conversion
        dictArray = productArray as! Array<Dictionary<String,AnyObject>>
        for (var i = 0; i < dictArray.count; i++){
            dictArray.append(productArray!.objectAtIndex(i) as! Dictionary<String, AnyObject>)
        }
    }
//reads price value of matching ProdID  
        func priceFromID(pId: Int) -> Int{
            var price = 0
            //iterate through array until relevant product is found
            for dict in dictArray{
                //reads 'ProdId' key and compares it to pId function argument
                if dict["ProdId"] as! Int == pId{
                    //if product ID is found price is set to its value
                    price = dict["Price"] as! Int
                    break
                }
            }
        return price;
    }
}//end class

Main方法只创建DataDump类的一个实例,并使用与ProdId:匹配的值运行priceFromID方法

//
//  main.swift
//  PListTester
//
//  Created by Kwangle on 29/11/2015.
//  Copyright (c) 2015 KwangCo All rights reserved.
//
import Foundation
//creates instance of Datadump class
var myData = Datadump ()
//queries data
print (myData.priceFromID(123) )

我得到的错误是:

fatal error: unexpectedly found nil while unwrapping an Optional value
(lldb)

这与线路有关:

let productArray = NSArray(contentsOfFile: fileLocation!)

我也得到了错误代码:

EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)

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

非常感谢,Kw

您不希望将内容加载到数组中。你想要一本字典。

看这里;

如何将.plist文件中的数据结构读取到NSArray 中

最新更新