Je veux enregistrer un Swift Style String Array dans NSUserDefaults, mais en fait, l'instruction "if" dans le code indique que returnValue est toujours nul.
Plus tard dans le code (iOS 8), je veux utiliser "food + = [" spaghetti "] pour ajouter de nouvelles entrées.
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()
}
}
Le code suivant devrait vous aider à résoudre votre problème:
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"]
}
}
Cependant, avec le code précédent, si vous définissez food = []
, vous aurez un problème car food
ne retournera pas ["muesli", "banana"]
. Afin d'éviter cela, vous pouvez préférer le code suivant:
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"]
}
}
Comme indiqué dans la documentation :
Pour les objets NSArray et NSDictionary, leur contenu doit être des objets de liste de propriétés.
Cela signifie que vous devez convertir vos objets String
en NSString
lors de l'enregistrement, quelque chose comme ceci devrait fonctionner:
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()
}
}
Dans Swift 3.0
Boutique
UserDefaults.standard.set(newValue, forKey: "yourkey")
UserDefaults.standard.synchronize()
Récupérer
var returnValue: [NSString]? = UserDefaults.standard.object(forKey: "yourkey") as? [NSString]
Supprimer
UserDefaults.standard.removeObject(forKey: "yourkey")
Référence: NSUserdefault objectTypes
Définir et obtenir NSUserDefault avec la fonction
Utilisez la fonction ci-dessous pour l'utiliser globalement, déclarez dans n'importe quelle classe toute utilisation dans l'application entière
Déclaration 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
}
Classname_where_this_function_declare.sharedInstance.setUserDefault("value", KeyToSave: "key")**