Armazenar em NSUserDefaults

Eu quero salvar um Swift Style String Array em NSUserDefaults, mas acutally a instrução “if” no código diz que returnValue é sempre nulo.

Posteriormente no código (iOS 8) eu quero usar “food + = [” spaghetti “] para adicionar novas inputs.

var food : [String] { get { var returnValue : [String]? = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] if returnValue == nil //Check for first run of app { returnValue = ["muesli", "banana"]; //Default value } return returnValue! } set (newValue) { NSUserDefaults.standardUserDefaults().setObject(newValue, forKey: "food") NSUserDefaults.standardUserDefaults().synchronize() } } 

O código a seguir deve ajudá-lo a resolver seu problema:

 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"] } } 

No entanto, com o código anterior, se você definir food = [] , você terá um problema, pois a food não retornará ["muesli", "banana"] . Para evitar isso, você pode preferir o seguinte código:

 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"] } } 

Conforme declarado na documentação :

Para objects NSArray e NSDictionary, seu conteúdo deve ser objects de lista de propriedades.

Isso significa que você precisa converter seus objects String em NSString ao salvar, algo assim deve funcionar:

 var food : [String] { get { var returnValue : [String]? = NSUserDefaults.standardUserDefaults().objectForKey("food") as? [String] if returnValue == nil //Check for first run of app { returnValue = ["muesli", "banana"]; //Default value } return returnValue! } set (newValue) { // Each item in newValue is now a NSString let val = newValue as [NSString] NSUserDefaults.standardUserDefaults().setObject(val, forKey: "food") NSUserDefaults.standardUserDefaults().synchronize() } } 

No Swift 3.0

Loja

 UserDefaults.standard.set(newValue, forKey: "yourkey") UserDefaults.standard.synchronize() 

Recuperar

 var returnValue: [NSString]? = UserDefaults.standard.object(forKey: "yourkey") as? [NSString] 

Remover

 UserDefaults.standard.removeObject(forKey: "yourkey") 

Referência: NSUserdefault objectTypes

Definir e obter NSUserDefault com function

Use a function abaixo para usar globalmente, declarar em qualquer class qualquer uso no aplicativo inteiro

Declaração n

 func setUserDefault(ObjectToSave : AnyObject? , KeyToSave : String) { let defaults = NSUserDefaults.standardUserDefaults() if (ObjectToSave != nil) { defaults.setObject(ObjectToSave, forKey: KeyToSave) } NSUserDefaults.standardUserDefaults().synchronize() } func getUserDefault(KeyToReturnValye : String) -> AnyObject? { let defaults = NSUserDefaults.standardUserDefaults() if let name = defaults.valueForKey(KeyToReturnValye) { return name } return nil } 

Como ligar

 Classname_where_this_function_declare.sharedInstance.setUserDefault("value", KeyToSave: "key")** 

//

  class func saveCustomObject(_ object: AnyObject?, key: String) { let encodedObject = NSKeyedArchiver.archivedData(withRootObject: object!) let userDefaults = UserDefaults.standard userDefaults.set(encodedObject, forKey: key) userDefaults.synchronize() } 

//

 class func loadCustomObject(_ key: String) -> AnyObject? { let userDefaults = UserDefaults.standard if let userDefaultKey = userDefaults.object(forKey: key) { let encodedObject = userDefaultKey as! NSData return NSKeyedUnarchiver.unarchiveObject(with: encodedObject as Data)! as AnyObject? } else { return nil } } 

//

 class func removeCustomObject(_ key: String) { // let encodedObject = NSKeyedArchiver.archivedDataWithRootObject(object!) let userDefaults = UserDefaults.standard userDefaults.removeObject(forKey: key) userDefaults.synchronize() } 

método de chamada

 let aParams : [String : String] = [ "DeviceType" : "iOS", ] CommonMethods.saveCustomObject(aParams as AnyObject?, key:Constants.kLoginData)