Ich muss ein Array erstellen, um Objekte mit diesem Format wie ein Wörterbuch in Swift hinzuzufügen: ["key1": "value1", "key2": "value2"]
Wenn ich versuche, es mit NSUserDefaults
allem zu speichern, ist das richtig, aber wenn ich NSUserDefaults
mit dem Schlüssel 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"))
}
swift
nsuserdefaults
xcode6
user3745888
quelle
quelle
Antworten:
Die Frage lautet "Array of Array", aber ich denke, die meisten Leute kommen wahrscheinlich hierher, um zu wissen, wie man ein Array speichert
UserDefaults
. Für diese Leute werde ich einige allgemeine Beispiele hinzufügen.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]()
Datumsarray
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 etwas mehr Arbeit zum Speichern
UserDefaults
. Informationen dazu finden Sie unter den folgenden Links.Anmerkungen
??
) können Sie das gespeicherte Array oder ein leeres Array ohne Absturz zurückgeben. Dies bedeutet, dass, wenn das Objekt Null zurückgibt, der Wert nach dem folgt??
stattdessen Operator verwendet wird .Int
,Bool
undDate
. Ich habe es auch mit getestetDouble
. Soweit ich weiß, funktioniert alles, was Sie in einer Eigenschaftsliste speichern können, so.quelle
Nur um das zu ergänzen, was @Zaph in den Kommentaren sagt.
Ich habe das gleiche Problem wie Sie, um zu wissen, dass das Array von
String
nicht gespeichert wird. Obwohl Apple Typen wie String und NSString überbrückt, konnte ich kein Array von[String]
beiden speichern[AnyObject]
.Jedoch eine Reihe von
[NSString]
funktioniert Arbeiten 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 definieren
[NSString : NSString]
, dass es funktioniert.BEARBEITEN
Lesen Sie Ihre Frage und Ihren Titel noch einmal durch
array of array
. Ich denke das, solange du bei bleibstNSString
, wird ein Array von Arrays funktionieren. Wenn Sie jedoch der Meinung sind, dass meine Antwort irrelevant ist, lassen Sie es mich einfach in den Kommentaren wissen und ich werde sie entfernen.quelle
Hier ist ein Beispiel für das Lesen und Schreiben einer Liste von Objekten des Typs
SNStock
, der implementiert wird.NSCoding
Wir haben einen Accessor für die gesamte Listewatchlist
und zwei Methoden zum Hinzufügen und Entfernen von Objekten, nämlichaddStock(stock: SNStock)
undremoveStock(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
NSCoding
daran, dass Ihr Objekt implementiert werden muss, da sonst die Codierung nicht funktioniert. SoSNStock
sieht es 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!
quelle
Versuche dies.
Um die Daten aus den UserDefaults abzurufen.
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)
quelle
Swift 4.0
Geschäft:
let arrayFruit = ["Apple","Banana","Orange","Grapes","Watermelon"] //store in user default UserDefaults.standard.set(arrayFruit, forKey: "arrayFruit")
Holen:
if let arr = UserDefaults.standard.array(forKey: "arrayFruit") as? [String]{ print(arr) }
quelle
Hier ist:
var array : [String] = ["One", "Two", "Three"] let userDefault = UserDefaults.standard // set userDefault.set(array, forKey: "array") // retrieve if let fetchArray = userDefault.array(forKey: "array") as? [String] { // code }
quelle
Wenn Sie mit Swift 5+ arbeiten , müssen Sie verwenden
UserDefaults.standard.setValue(value, forKey: key)
und gespeicherte Daten erhalten, die Sie verwenden müssenUserDefaults.standard.dictionary(forKey: key)
.quelle