ios - how to use dict inside a plist -
i have plist file like
<dict> <key>horse</key> <dict> <key>level</key> <integer>2</integer> </dict> </dict>
and load code bellow
let path = nsbundle.mainbundle().pathforresource("test", oftype: "plist") database = nsdictionary(contentsoffile: path!) let array = nsmutablearray() member in (database.allkeys) { let level = member.valueforkey("level") as! int if () { //do } }
when app runs, crash. reason think member in database can't cast nsdictionary since it's nstaggedpointerstring, don't know how make work.
update:
the previous question, have addressed answer @wonzigii, , got right dict using method defined validatecard(), @wonzigii said bellow.
func validatecard() -> nsarray?
now want randomly retrieve item inside new array use something, i'm solving issue using random index, seem can't array item index, since if did so, can't use next layer dict. should next?
if let avaliablecarddeck = self.validatecard() { _ 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) } }
the reason allkeys
return array contains type anyobject
. yet member
, in case, anyobject
type.
for member in (database!.allkeys) member as? string == "horse" { let integer = database?.valueforkeypath("horse.level") as! int print(integer) }
note allkeys
return top level keys.
edit:
the below code use member
key loop through dictionary retrieve deeper value.
for member in (database!.allkeys) { if let dic = database?.valueforkey(member as! string) { // level value or else let integer = dic.valueforkey("level") as! int print(integer) } }
more swiftly way(without forced unwrapping, aka, !
):
if let path = nsbundle.mainbundle().pathforresource("test", oftype: "plist"), db = nsdictionary(contentsoffile: path) as? [string: anyobject] { member in db.keys { if let dic = db[member] { // level value or else let integer = dic.valueforkey("level") as! int print(integer) } } }
Comments
Post a Comment