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