Arrays 如何从plist文件返回特定值?
所以我有一个名为Computer的plist文件,上面有5个项目 每个项目都有以下关键点:Arrays 如何从plist文件返回特定值?,arrays,swift,plist,Arrays,Swift,Plist,所以我有一个名为Computer的plist文件,上面有5个项目 每个项目都有以下关键点: Type Price UniqueCode 比如说 项目0 类型:台式机,价格100,唯一代码321 项目1 类型:平板电脑,价格150,唯一代码322 项目2 类型:笔记本电脑,价格200,唯一代码323 项目3 类型:台式机,价格210,唯一代码324 项目4 类型:笔记本电脑,价格400,唯一代码325 然后我有一节课: 我已经输入了以下代码: var emojiArray: NSArray? i
Type
Price
UniqueCode
比如说
项目0
类型:台式机,价格100,唯一代码321
项目1
类型:平板电脑,价格150,唯一代码322
项目2
类型:笔记本电脑,价格200,唯一代码323
项目3
类型:台式机,价格210,唯一代码324
项目4
类型:笔记本电脑,价格400,唯一代码325
然后我有一节课:
我已经输入了以下代码:
var emojiArray: NSArray?
if let path = NSBundle.mainBundle().pathForResource("Computer", ofType: "plist"){
emojiArray = NSArray(contentsOfFile: path)
}
我知道这是不完整的,但这就是我能走的路。我的主要目标是显示具有唯一代码321和324的计算机的价格,同时我还必须显示其价格的一半
我将如何编写此代码 根据您的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>
类型
桌面
价格
100
唯一代码
321
类型
笔记本电脑
价格
400
唯一代码
235
因此,一旦加载了emojiArray,就可以遍历数组并获取所需的值
例如,类似于:
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")
}
}
}
}
}
}
如果let path=Bundle.main.path(用于资源:“计算机”,类型为“plist”){
如果让emojiArray=NSArray(contentsOfFile:path){
如果让typedEmojiArray=emojiArray作为数组>{
对于typedEmojiArray中的每一项{
如果让uniqueCode=eachEntry[“唯一代码”]作为NSNumber{
如果让computerType=eachEntry[“Type”]作为字符串{
打印(“计算机类型为\(计算机类型),唯一代码为\(唯一代码)”)
}
如果唯一代码==321{
打印(“这是我们想要的值”)
}
}
}
}
}
}
这是在Swift 3,b.t.w.中完成的
此外,像这样的plist不一定是在文件中存储数据的最佳方式。如果这是我的应用程序,我可能会尝试使用CaleDATA(在发布之间保持数据)。 < P>首先,您强烈反对在SWIFT中使用<代码> NSals/NSCORCHON/<代码>,因为基础集合类型缺少类型信息。建议反序列化属性列表的类是
PropertyListSerialization
(Swift 3)代码打印UniqueCode
和Price
中所有UniqueCode
项目的UniqueCode
值
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的等价物(据我记忆所及)是
如果Swift 2语法错误,请注释掉这些行,并使用代码补全重新键入。哦,我不同意这一点。核心数据不是一项初学者技术。如果您只想保存一些数据,那么这肯定是不合适的。我认为它使用得太多了,不必要。您好,我使用的是Swift 2,我收到了一个错误,上面写着“使用unsolves标识符‘Bundle’感谢您使用的是比Xcode 8旧的东西(即您使用的是Swift 2.3或更旧的)。@vadian我在这一行遇到了一个错误“let data=try data(contentsOfURL:url)”这句话运算符后应为表达式。很抱歉,
NSData
@vadian修复了它,但出现了另一个错误。它现在说“使用未解析的标识符‘url’……对不起,修复请求太多了。
if let url = NSBundle.mainBundle().urlForResource("Computer", withExtension: "plist") {
...
let data = try NSData(contentsOfURL:url)
let emojiArray = try NSPropertyListSerialization.propertyListFromData(data, options: [], format: nil) as! [[String:AnyObject]]