【问题标题】:How to use NSUserDefaults with property getter and setter in Swift?如何在 Swift 中将 NSUserDefaults 与属性 getter 和 setter 一起使用?
【发布时间】:2016-07-13 07:30:22
【问题描述】:

我试图直接从它的 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")

    }

}
}

【问题讨论】:

  • 什么是内存?您在 NSUserDefaults 中存储数据的代码在哪里?
  • 基本上这段代码不会导致死循环。 taskList是如何使用的?

标签: swift nsuserdefaults


【解决方案1】:

你的意思是这样的吗?

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

【讨论】:

  • 效果很好。知道为什么我的实施不起作用吗?我将内存定义为 NSUderDefaults.standardUserDefaults
【解决方案2】:

在您的示例中,@irkinosor,在执行更新/设置时,您没有在称为“内存”的 NSUserDefaults 实例上调用 synchronize()。这可能是一个因素。

【讨论】:

    猜你喜欢
    • 2021-10-22
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 2016-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-18
    相关资源
    最近更新 更多