inside custom ios swift string nsarray nsuserdefaults

ios - custom - Tienda[String] en NSUserDefaults



swift user defaults custom class (5)

Quiero guardar un Swift Style String Array en NSUserDefaults, pero en realidad la declaración "if" en el código dice que returnValue siempre es nulo.

Más adelante en el código (iOS 8) quiero usar "food + = [" spaghetti "] para agregar nuevas entradas.

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


//

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

llamar al método

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


Como se indica en la documentation :

Para objetos NSArray y NSDictionary, sus contenidos deben ser objetos de lista de propiedades.

Esto significa que necesita convertir sus objetos String a NSString al guardar, algo como esto debería 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() } }


El siguiente código debería ayudarlo a resolver su 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"] } }

Sin embargo, con el código anterior, si configura food = [] , tendrá un problema ya que la food no regresará ["muesli", "banana"] . Para evitar esto, puede preferir el siguiente 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"] } }


En Swift 3.0

Almacenar

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

Recuperar

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

retirar

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

Referencia: NSUserdefault objectTypes


Establecer y obtener NSUserDefault con la función

Use la función siguiente para usar globalmente, declarar en cualquier clase cualquier uso en la aplicación completa

Declaració 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 llamar

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