2016-07-26 67 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

編輯答案並添加了更通用的遍歷 –