Search code examples
swiftgetsetvar

var with nil value using protocol set get


Why is the token nil after I set is value?

var token: Token {
    set {
        let encodedData = NSKeyedArchiver.archivedData(withRootObject: self.token)
        UserDefaults.standard.set(encodedData, forKey: File.UserDefaults.token)
    }
    get {
        if let data = UserDefaults.standard.data(forKey:  File.UserDefaults.token),
            let obj = NSKeyedUnarchiver.unarchiveObject(with: data) as? Token {
            return obj
        } else {
            return Token()
        }
    }
}

Solution

  • Instead of using self.token in the set statement use newValue.

    set {
        let encodedData = NSKeyedArchiver.archivedData(withRootObject: newValue)
        UserDefaults.standard.set(encodedData, forKey: File.UserDefaults.token)
    }
    

    When calling self.token in set you are basically calling the get statement. To actually receive the value that is set you'll need to use newValue. newValue is basically a hidden parameter of the set statement.