如何在Swift中使用带有属性getter和setter的NSUserDefaults?

时间:2016-07-13 07:30:23

标签: swift nsuserdefaults

我试图直接从其setter和getter属性保存和检索内存中的变量但是getter导致无限循环并且应用程序崩溃并显示错误消息:

  

错误:执行被中断,原因:EXC_BAD_ACCESS(代码= 2,地址= 0x10049b9a0)。   该过程已返回到表达式评估之前的状态。

可能是什么原因以及如何正确地做到这一点?

  class Task {

    let memory = NSUderDefaults.standardUserDefaults() 
    var taskList: [String: Double]{

    get {

        let savedList = memory.dictionaryForKey("SavedTasksList") as? [String: Double] ?? [String: Double]()

        return savedList
    }

    set (tasks){

        memory.setObject(tasks, forKey: "SavedTasksList")

    }

}
}

2 个答案:

答案 0 :(得分:5)

你的意思是这样吗?

class Task {

    var taskList: [String: Double]{

        get {
            return NSUserDefaults.standardUserDefaults().objectForKey("SavedTasksList") as? [String: Double] ?? [String: Double]()
        }

        set {
            let defaults = NSUserDefaults.standardUserDefaults()
            defaults.setObject(newValue, forKey: "SavedTasksList")
            defaults.synchronize()
        }
    }
}

或者在Swift 3中:

class Task {

    var taskList: [String: Double]{

        get {
            return UserDefaults.standardUserDefaults().objectForKey("SavedTasksList") as? [String: Double] ?? [String: Double]()
        }

        set {
            let defaults = UserDefaults.standardUserDefaults()
            defaults.setObject(newValue, forKey: "SavedTasksList")
            defaults.synchronize()  
        }
    }
}

答案 1 :(得分:0)

在你的例子中,@ irkinosor,你没有在名为" memory"的NSUserDefaults实例上调用synchronize()。执行更新/设置时。这可能是一个因素。