Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何从plist文件返回特定值?_Arrays_Swift_Plist - Fatal编程技术网

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

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

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

每个项目都有以下关键点:

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]]