comment sauvegarder et lire le tableau de tableaux dans NSUserDefaults dans swift?
j'ai besoin de créer un tableau pour ajouter des objets avec ce format comme un dictionnaire Swift : ["key1": "valeur1", "key2": "valeur2"]
quand j'essaie de le sauvegarder avec NSUserDefaults
tout est correct, mais quand lu NSUserDefaults
avec la touche ce plane. Ce type de données n'mon var obj besoin?
let def = NSUserDefaults.standardUserDefaults()
var key = "keySave"
var element: AnyObject!
var array1: [AnyObject!] = []
array1.append(["key1": "val1", "key2": "val2"])
array1.append(["key1": "val1", "key2": "val2"])
//save
var savestring : [AnyObject!]
savestring = array1
var defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(savestring, forKey: key)
defaults.synchronize()
//read
var obj: [AnyObject!] = []
if(obj != nil){
print("size: ")
print(obj.count) //vary long value confused..
element = obj[0] //crash
print(element.objectForKey("key1"))
}
5 réponses
la question se lit" array of array "mais je pense que la plupart des gens viennent ici juste pour savoir comment sauver un array à UserDefaults
. Pour ces personnes, j'ajouterai quelques exemples courants.
tableau de Chaîne
Enregistrer le tableau
let array = ["horse", "cow", "camel", "sheep", "goat"]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")
tableau de récupération
let defaults = UserDefaults.standard
let myarray = defaults.stringArray(forKey: "SavedStringArray") ?? [String]()
Int tableau
Enregistrer le tableau
let array = [15, 33, 36, 723, 77, 4]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedIntArray")
tableau de récupération
let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedIntArray") as? [Int] ?? [Int]()
Bool array
Enregistrer le tableau
let array = [true, true, false, true, false]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedBoolArray")
tableau de récupération
let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedBoolArray") as? [Bool] ?? [Bool]()
Date de la matrice de
Enregistrer le tableau
let array = [Date(), Date(), Date(), Date()]
let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedDateArray")
tableau de récupération
let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedDateArray") as? [Date] ?? [Date]()
tableau d'Objets
objets Personnalisés (et, par conséquent, les tableaux d'objets) de prendre un peu plus de travail pour enregistrer UserDefaults
. Voir les liens suivants pour savoir comment faire.
- Enregistrer les objets personnalisés dans NSUserDefaults
- Docs pour l'enregistrement de la couleur à UserDefaults
- tentative de définir un objet de non-liste de propriétés comme un NSUserDefaults
Notes
- Le néant, la coalescence de l'opérateur (
??
) vous permet de retourner le tableau enregistré ou un tableau vide sans s'écraser. Cela signifie que si l'objet retourne zéro, la valeur qui suit l'opérateur??
sera utilisée à la place. - comme vous pouvez le voir, la configuration de base était la même pour
Int
,Bool
, etDate
. Je l'ai aussi testé avecDouble
. Pour autant que je sais, tout ce que vous pouvez enregistrer dans une liste de propriétés fonctionne comme ceci.
juste pour ajouter à ce que @Zaph dit dans les commentaires.
j'ai le même problème que vous, à savoir, le tableau de String
n'est pas enregistré. Même si Apple bridges types tels que String et NSString, Je n'ai pas été en mesure de sauvegarder un tableau de [String]
ni de [AnyObject]
.
Cependant un tableau de [NSString]
fonctionne pour moi.
donc votre code pourrait ressembler à ça:
var key = "keySave"
var array1: [NSString] = [NSString]()
array1.append("value 1")
array1.append("value 2")
//save
var defaults = NSUserDefaults.standardUserDefaults()
defaults.setObject(array1, forKey: key)
defaults.synchronize()
//read
if let testArray : AnyObject? = defaults.objectForKey(key) {
var readArray : [NSString] = testArray! as [NSString]
}
Note que j'ai créé un tableau de NSString et pas un dictionnaire. Je n'ai pas vérifié si cela fonctionne avec un dictionnaire, mais probablement vous devrez définir les choses comme [NSString : NSString]
pour le faire fonctionner.
MODIFIER
relisant votre question et votre titre, vous parlez de array of array
. Je pense que tant que vous restez avec NSString
, une rangée de tableau fonctionnera. Toutefois, si vous pensez que ma réponse n'est pas pertinent, faites le moi savoir dans les commentaires et je vais l'enlever.
voici un exemple de lecture et d'écriture d'une liste d'objets de type SNStock
qui implémente NSCoding
- nous avons un accessor pour la liste entière, watchlist
, et deux méthodes pour ajouter et supprimer des objets, c'est-à-dire addStock(stock: SNStock)
et removeStock(stock: SNStock)
.
import Foundation
class DWWatchlistController {
private let kNSUserDefaultsWatchlistKey: String = "dw_watchlist_key"
private let userDefaults: NSUserDefaults
private(set) var watchlist:[SNStock] {
get {
if let watchlistData : AnyObject = userDefaults.objectForKey(kNSUserDefaultsWatchlistKey) {
if let watchlist : AnyObject = NSKeyedUnarchiver.unarchiveObjectWithData(watchlistData as! NSData) {
return watchlist as! [SNStock]
}
}
return []
}
set(watchlist) {
let watchlistData = NSKeyedArchiver.archivedDataWithRootObject(watchlist)
userDefaults.setObject(watchlistData, forKey: kNSUserDefaultsWatchlistKey)
userDefaults.synchronize()
}
}
init() {
userDefaults = NSUserDefaults.standardUserDefaults()
}
func addStock(stock: SNStock) {
var watchlist = self.watchlist
watchlist.append(stock)
self.watchlist = watchlist
}
func removeStock(stock: SNStock) {
var watchlist = self.watchlist
if let index = find(watchlist, stock) {
watchlist.removeAtIndex(index)
self.watchlist = watchlist
}
}
}
rappelez-vous que votre objet doit implémenter NSCoding
sinon l'encodage ne fonctionnera pas. Voici à quoi ressemble SNStock
:
import Foundation
class SNStock: NSObject, NSCoding
{
let ticker: NSString
let name: NSString
init(ticker: NSString, name: NSString)
{
self.ticker = ticker
self.name = name
}
//MARK: NSCoding
required init(coder aDecoder: NSCoder) {
self.ticker = aDecoder.decodeObjectForKey("ticker") as! NSString
self.name = aDecoder.decodeObjectForKey("name") as! NSString
}
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(ticker, forKey: "ticker")
aCoder.encodeObject(name, forKey: "name")
}
//MARK: NSObjectProtocol
override func isEqual(object: AnyObject?) -> Bool {
if let object = object as? SNStock {
return self.ticker == object.ticker &&
self.name == object.name
} else {
return false
}
}
override var hash: Int {
return ticker.hashValue
}
}
Espérons que cette aide!
Swift 4.0
Magasin:
let arrayFruit = ["Apple","Banana","Orange","Grapes","Watermelon"]
//store in user default
UserDefaults.standard.set(arrayFruit, forKey: "arrayFruit")
Fetch:
if let arr = UserDefaults.standard.array(forKey: "arrayFruit") as? [String]{
print(arr)
}
essayez ceci.
pour obtenir les données de L'UserDefaults.
var defaults = NSUserDefaults.standardUserDefaults()
var dict : NSDictionary = ["key":"value"]
var array1: NSArray = dict.allValues // Create a dictionary and assign that to this array
defaults.setObject(array1, forkey : "MyKey")
var myarray : NSArray = defaults.objectForKey("MyKey") as NSArray
println(myarray)