所以我有一个名为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的计算机的价格,同时我也必须降低其价格的一半。
我将如何编码?
答案 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
Price
和UniqueCode
的一半的值
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语法错误,请注释掉行并使用代码完成重新键入它们。