2016-07-26 123 views
2

里面我有一个像如何使用字典一个的plist

<dict> 
    <key>horse</key> 
    <dict> 
     <key>level</key> 
     <integer>2</integer> 
    </dict> 
</dict> 

plist文件中,并通过我的代码加载波纹管

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

,当应用程序运行时,它会崩溃。我认为的原因是dataBase中的成员不能转换为NSDictionary,因为它是NSTaggedPointerString,我不知道如何使它工作。

更新:

前一个问题,我已经解决了由@Wonzigii答案,现在我用这个方法我定义validateCard()右字典,这是@Wonzigii所述波纹管。

func validateCard() -> NSArray? 

现在我想随意检索新的阵列内的项目用它来做些什么,什么我解决这个问题是使用随机指数,但似乎被我不能得到的数组项索引,因为如果我这样做了,我不能用它来获得下一层字典。接下来我应该做什么?

if let avaliableCardDeck = self.validateCard() { 
    for _ in 0...16 { 
     let maxAvaliableCards = avaliableCardDeck.count 
     let index = Int(arc4random()) % maxAvaliableCards 
     let cardInfo = avaliableCardDeck[index] 
     let newCard = PlayCard() 
     newCard.rank = cardInfo.valueForKey("number") as! Int 
     newCard.imageName = cardInfo.valueForKey("imageSource") as? String 
     addCard(newCard) 
    } 
    } 

回答

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) 
     } 
    } 
} 
+0

我想我找到了失事原因,但我不能找到解决这个问题的好办法。就像你提到的那样,我认为它会起作用,但是只对马,我打算使用allKeys来获得数组,并且我可以为数组中的每个项目调用valueForKeyPath。 – Ryan

+0

因为allKeys我得到一个NSTaggedPointerString的数组,NSString的子类,它不能响应字典的方法,并导致崩溃,我可以有更好的方法将它转换回NSDictionary? – Ryan

+0

@瑞恩当然可以。看我的编辑。 –

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

我们可以有更通用的守卫风格,因为马只是一个例子,我有更多的项目,他们是一样的马,我将使用它们。 – Ryan

+0

编辑答案并添加了更通用的遍历 –