webentwicklung-frage-antwort-db.com.de

Wie speichere und lese ich Array von Array in NSUserdefaults in Swift?

Ich muss ein Array erstellen, um Objekte mit diesem Format wie ein Wörterbuch in Swift: ["key1": "value1", "key2": "value2"] hinzuzufügen.

Wenn ich versuche, es mit NSUserDefaults zu speichern, ist alles in Ordnung, aber wenn ich NSUserDefaults mit der Taste lese, stürzt dies ab. Welche Art von Daten benötigt mein var obj?

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"))
}
68
user3745888

Die Frage lautet "array of array", aber ich denke, die meisten Leute kommen wahrscheinlich hierher, um zu wissen, wie man ein Array in UserDefaults speichert. Für diese Leute möchte ich einige Beispiele anführen.

String-Array

Array speichern

let array = ["horse", "cow", "camel", "sheep", "goat"]

let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedStringArray")

Array abrufen

let defaults = UserDefaults.standard
let myarray = defaults.stringArray(forKey: "SavedStringArray") ?? [String]()

Int Array

Array speichern

let array = [15, 33, 36, 723, 77, 4]

let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedIntArray")

Array abrufen

let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedIntArray")  as? [Int] ?? [Int]()

Bool-Array

Array speichern

let array = [true, true, false, true, false]

let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedBoolArray")

Array abrufen

let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedBoolArray")  as? [Bool] ?? [Bool]()

Datumsfeld

Array speichern

let array = [Date(), Date(), Date(), Date()]

let defaults = UserDefaults.standard
defaults.set(array, forKey: "SavedDateArray")

Array abrufen

let defaults = UserDefaults.standard
let array = defaults.array(forKey: "SavedDateArray")  as? [Date] ?? [Date]()

Objektarray

Benutzerdefinierte Objekte (und folglich Arrays von Objekten) erfordern ein wenig mehr Arbeit, um sie in UserDefaults zu speichern. Informationen dazu finden Sie unter den folgenden Links.

Anmerkungen

  • Mit dem Null-Koaleszenz-Operator (??) Können Sie das gespeicherte Array oder ein leeres Array ohne Absturz zurückgeben. Das heißt, wenn das Objekt nil zurückgibt, wird stattdessen der Wert verwendet, der dem Operator ?? Folgt.
  • Wie Sie sehen, war die Grundeinstellung für Int, Bool und Date dieselbe. Ich habe es auch mit Double getestet. Soweit ich weiß, funktioniert alles, was Sie in einer Eigenschaftsliste speichern können, so.
150
Suragch

Nur um das zu ergänzen, was @Zaph in den Kommentaren sagt.

Ich habe das gleiche Problem wie Sie, wie Sie wissen, wird das Array von String nicht gespeichert. Obwohl Apple überbrückt Typen wie String und NSString, war ich nicht in der Lage, ein Array von [String] Weder von [AnyObject] Zu speichern.

Ein Array von [NSString] Funktioniert jedoch für mich.

Ihr Code könnte also so aussehen:

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]
}

Beachten Sie, dass ich ein Array von NSString und kein Wörterbuch erstellt habe. Ich habe nicht überprüft, ob es mit einem Wörterbuch funktioniert, aber wahrscheinlich müssen Sie die Dinge als [NSString : NSString] Definieren, damit es funktioniert.

EDIT

Wenn Sie Ihre Frage und Ihren Titel noch einmal lesen, sprechen Sie von array of array. Ich denke, solange Sie bei NSString bleiben, wird ein Array von Array funktionieren. Wenn Sie jedoch der Meinung sind, dass meine Antwort irrelevant ist, lassen Sie es mich in den Kommentaren wissen und ich werde sie entfernen.

16
HpTerm

Hier ist ein Beispiel für das Lesen und Schreiben einer Liste von Objekten des Typs SNStock, die NSCoding implementiert. Wir haben einen Zugriffsmechanismus für die gesamte Liste, watchlist, und zwei Methoden zum Hinzufügen und entferne Objekte, das heißt addStock(stock: SNStock) und 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
    }
  }

}

Denken Sie daran, dass Ihr Objekt muss NSCoding implementieren andernfalls funktioniert die Codierung nicht. So sieht SNStock aus:

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

Hoffe das hilft!

11
Zorayr

Versuche dies.

So rufen Sie die Daten aus den UserDefaults ab.

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)
3
Alvin Varghese

Swift 4.

Store:

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