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"))
}
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.
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]()
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]()
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]()
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]()
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.
??
) 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.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.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.
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!
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)
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)
}