irkinosor
irkinosor

Reputation: 776

How to use NSUserDefaults with property getter and setter in Swift?

I am trying to save and retrieve a variable in memory directly from its setter and getter property but the getter result in an infinite loop and the app crash with error message :

error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=2, address=0x10049b9a0). The process has been returned to the state before expression evaluation.

What could be the reason and how to do this properly?

  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")

    }

}
}

Upvotes: 2

Views: 1823

Answers (2)

Rob
Rob

Reputation: 5954

In your example, @irkinosor, you are not calling synchronize() on your instance of the NSUserDefaults called "memory" when performing an update/set. That could be a factor.

Upvotes: 0

JMI
JMI

Reputation: 2628

Do you mean something like this?

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

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

Upvotes: 5

Related Questions