更新 NSUserDefaults 嵌套字典

Update NSUserDefaults Nested Dictionary

我有一个关卡设置列表

defaultPrefs.plist

Root     Dictionary
Level1   Dictionary
 time     Number     0
 pushes   Number     0
 moves    Number     0
 unlocked Boolean    YES
Level2   Dictionary
 time     Number     0
 pushes   Number     0
 moves    Number     0
 unlocked Boolean    NO

等等

我正在 AppDelegate 中注册它们

let plist: String? = "defaultPrefs"

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    let path = NSBundle.mainBundle().pathForResource(plist, ofType: "plist")!
    let dict = NSDictionary(contentsOfFile: path) as! [String: AnyObject]
    NSUserDefaults.standardUserDefaults().registerDefaults(dict)
}

我想更新这些

 func writeToPlist() {
      let defaults = NSUserDefaults.standardUserDefaults()
      let level1Dict:AnyObject = defaults.objectForKey("Level1")!
      //let level1Dict:AnyObject = defaults.dictionaryForKey("Level1")!
      level1Dict.setValue(1, forKey: "moves")          
      //level1Dict.setInteger(1, forKey: "moves")
 }

错误:

mutating method sent to immutable object


一旦它工作了,我将传入变量来选择 Dict Level 和 Key 等


更新

let level1Dict:AnyObject = defaults.objectForKey("Level1")!.mutableCopy()

level1Dict.setValue(1, forKey: "moves")
defaults.setObject(level1Dict, forKey: "Level1")

从用户默认值返回的字典是不可变的,因此您需要先制作一个可变副本,然后才能对其进行编辑:

let level1Dict:AnyObject = defaults.objectForKey("Level1")!.mutableCopy()

另请注意,编辑词典不会自动更新用户默认设置,您需要为密钥设置新词典(以替换旧设置的完整词典)。