如何在plist中使用dict

时间:2016-07-26 00:59:45

标签: ios swift

我有像

这样的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?

2 个答案:

答案 0 :(得分:1)

原因是allKeys将返回包含类型AnyObject的数组。 但是,在这种情况下,memberAnyObject类型。

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