如何从plist文件返回特定值?

时间:2016-12-10 12:59:47

标签: arrays swift plist

所以我有一个名为Computer的plist文件,它上面有5个项目。

每个项目都有以下这些键:

Type
Price
UniqueCode

例如

  

项目0

     

类型:桌面,价格100,UniqueCode 321

     

第1项

     

类型:平板电脑,价格150,UniqueCode 322

     

第2项

     

类型:笔记本电脑,价格200,UniqueCode 323

     

第3项

     

类型:桌面,价格210,UniqueCode 324

     

第4项

     

类型:笔记本电脑,价格400,UniqueCode 325

然后我有一个班级:

我已经输入以下代码:

var emojiArray: NSArray?
if let path = NSBundle.mainBundle().pathForResource("Computer", ofType: "plist"){
    emojiArray = NSArray(contentsOfFile: path)
}

我知道它不完整,但那是我能走得多远。我的主要目标是显示具有UniqueCode 321和324的计算机的价格,同时我也必须降低其价格的一半。

我将如何编码?

2 个答案:

答案 0 :(得分:1)

从你的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>Type</key>
        <string>Desktop</string>
        <key>Price</key>
        <integer>100</integer>
        <key>Unique Code</key>
        <integer>321</integer>
    </dict>
    <dict>
        <key>Type</key>
        <string>Laptop</string>
        <key>Price</key>
        <integer>400</integer>
        <key>Unique Code</key>
        <integer>235</integer>
    </dict>
</array>
</plist>

因此,一旦加载了emojiArray,就可以遍历数组并获取您正在寻找的值。

E.G。类似的东西:

    if let path = Bundle.main.path(forResource: "Computer", ofType: "plist") {
        if let emojiArray = NSArray(contentsOfFile: path) {

            if let typedEmojiArray = emojiArray as? Array< Dictionary< String, AnyObject > > {
            for eachEntry in typedEmojiArray {
                    if let uniqueCode = eachEntry["Unique Code"] as? NSNumber {
                        if let computerType = eachEntry["Type"] as? String {
                            print("computer type is \(computerType) and unique code is \(uniqueCode)")
                        }

                        if uniqueCode == 321 {
                            print("this is a value we wanted")
                        }

                    }

                }
            }
        }
    }

这是在Swift 3,b.t.w。

中完成的

此外,像这样的Plists不一定是在文件中存储数据的最佳方式。如果这是我的应用程序,我可能会尝试使用CoreData(在启动之间保持数据)。

答案 1 :(得分:0)

首先,强烈建议您不要在Swift中使用mysql_*,因为Foundation集合类型缺少类型信息。反序列化属性列表的推荐类是NSArray / NSDictionary

(Swift 3)代码为PropertyListSerialization位于UniqueCode

的所有项目打印PriceUniqueCode的一半的值
uniqueCodes

Swift 2等价物(据我记得)是

let uniqueCodes = [321, 324]

if let url = Bundle.main.url(forResource:"Computer", withExtension: "plist") {
    do {
        let data = try Data(contentsOf:url)
        let emojiArray = try PropertyListSerialization.propertyList(from: data, options: [], format: nil) as! [[String:Any]]
        let filteredArray = emojiArray.filter{ uniqueCodes.contains($0["UniqueCode"] as! Int)}
        for item in filteredArray {
            print(item["UniqueCode"] as! Int, item["Price"] as! Int / 2)
        }
    } catch {
        print(error)
    }
}

如果Swift 2语法错误,请注释掉行并使用代码完成重新键入它们。