我有像
这样的plist文件sorted
我按照下面的代码
加载它<dict>
<key>horse</key>
<dict>
<key>level</key>
<integer>2</integer>
</dict>
</dict>
当应用运行时,它会崩溃。我认为数据库中的成员不能被强制转换为NSDictionary,因为它是NSTaggedPointerString,我不知道如何使其工作。
更新
上一个问题,我已经通过@Wonzigii解决了问题,现在我使用这个方法得到了正确的dict我定义了validateCard(),这是@Wonzigii说的吼叫。
let path = NSBundle.mainBundle().pathForResource("test", ofType: "plist")
dataBase = NSDictionary(contentsOfFile: path!)
let array = NSMutableArray()
for member in (dataBase.allKeys) {
let level = member.valueForKey("level") as! Int
if () {
//do something
}
}
现在我想在新数组中随机检索它的项目以使用它来做某事,我解决这个问题的方法是使用随机索引,但似乎我无法获得数组项目索引,因为如果我这样做,我就无法使用它来获得下一层字典。接下来我该怎么办?
func validateCard() -> NSArray?
答案 0 :(得分:1)
原因是allKeys
将返回包含类型AnyObject
的数组。
但是,在这种情况下,member
是AnyObject
类型。
for member in (dataBase!.allKeys) where member as? String == "horse" {
let integer = dataBase?.valueForKeyPath("horse.level") as! Int
print(integer)
}
请注意,allKeys
始终返回顶级键。
编辑:
以下代码将使用member
作为循环字典以检索更深层值的键。
for member in (dataBase!.allKeys) {
if let dic = dataBase?.valueForKey(member as! String) {
// get the level value or something else
let integer = dic.valueForKey("level") as! Int
print(integer)
}
}
更快捷的方式(没有强制解包,又称!
):
if let path = NSBundle.mainBundle().pathForResource("test", ofType: "plist"), db = NSDictionary(contentsOfFile: path) as? [String: AnyObject] {
for member in db.keys {
if let dic = db[member] {
// get the level value or something else
let integer = dic.valueForKey("level") as! Int
print(integer)
}
}
}
答案 1 :(得分:0)
试一试。如果路径和所有路径都正确,则此代码必须正常工作,否则将无法执行。肯定不会崩溃
guard let path = NSBundle.mainBundle().pathForResource("test", ofType: "plist") else {
return
}
if let dataBase = NSDictionary(contentsOfFile: path), member = dataBase["horse"] as? [String: AnyObject] {
if let level = member["level"] as? Int {
//do something
}
}
编辑:提供通用的
guard let path = NSBundle.mainBundle().pathForResource("test", ofType: "plist") else {
return
}
if let dataBase = NSDictionary(contentsOfFile: path) {
for (_, value) in dataBase {
if value is [String: AnyObject], let level = value["level"] as? Int {
//do something
}
}
}