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"))
}
43
demandé sur Suragch 2014-08-07 14:06:17

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.

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 , et Date . Je l'ai aussi testé avec Double . Pour autant que je sais, tout ce que vous pouvez enregistrer dans une liste de propriétés fonctionne comme ceci.
110
répondu Suragch 2018-09-18 01:05:45

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.

14
répondu HpTerm 2018-09-10 19:48:43

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!

7
répondu Zorayr 2015-04-16 18:38:20

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)
    }
1
répondu Mr.Javed Multani 2018-03-26 09:55:47

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)
0
répondu Alvin Varghese 2014-10-21 12:46:13