Store [String] in NSUserDefaults

前端 未结 5 1104
南方客
南方客 2020-11-27 17:35

I want to save a Swift Style String Array into NSUserDefaults, but acutally the \"if\" statement in the code says that returnValue is always nil.

Later in the code (

5条回答
  •  青春惊慌失措
    2020-11-27 18:29

    The following code should help you resolve your problem:

    import UIKit
    
    class ViewController: UIViewController {
    
        var food: [String] {
            get {
                if let returnValue = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] {
                    return returnValue
                } else {
                    return ["muesli", "banana"] //Default value
                }
            }
            set {
                NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
                NSUserDefaults.standardUserDefaults().synchronize()
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            print(food) // prints: ["muesli", "banana"] (at first launch)
    
            food = ["cake"]
            print(food) // prints: ["cake"]
    
            food += ["spaghetti"]
            print(food) // prints: ["cake", "spaghetti"]
    
            food = []
            print(food) // prints: []
    
            NSUserDefaults.standardUserDefaults().setObject(nil, forKey: "food")
            print(food) // prints: ["muesli", "banana"]
        }
    
    }
    

    However, with the previous code, if you set food = [], you will have a problem as food won't return ["muesli", "banana"]. In order to avoid this, you may prefer the following code:

    import UIKit
    
    class ViewController: UIViewController {
    
        var food: [String] {
            get {
                if let returnValue = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] {
                    return returnValue == [] ? ["muesli", "banana"] : returnValue
                } else {
                    return ["muesli", "banana"] //Default value
                }
            }
            set {
                NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food")
                NSUserDefaults.standardUserDefaults().synchronize()
            }
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            print(food) // prints: ["muesli", "banana"] (at first launch)
    
            food = ["cake"]
            print(food) // prints: ["cake"]
    
            food += ["spaghetti"]
            print(food) // prints: ["cake", "spaghetti"]
    
            food = []
            print(food) // prints: ["muesli", "banana"]
    
            NSUserDefaults.standardUserDefaults().setObject(nil, forKey: "food")
            print(food) // prints: ["muesli", "banana"]
        }
    
    }
    

提交回复
热议问题