Necesito crear una matriz para agregar objetos con este formato como un diccionario en Swift: ["clave1": "valor1", "clave2": "valor2"]
Cuando trato de guardarlo con NSUserDefaults
todo es correcto, pero cuando lo leo NSUserDefaults
con la clave, esto falla. ¿Qué tipo de datos necesita mi 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
usuario3745888
fuente
fuente
Respuestas:
La pregunta dice "matriz de matriz", pero creo que la mayoría de las personas probablemente vienen aquí solo para saber cómo guardar una matriz en
UserDefaults
. Para esas personas, agregaré algunos ejemplos comunes.Matriz de cadenas
Guardar matriz
let array = ["horse", "cow", "camel", "sheep", "goat"] let defaults = UserDefaults.standard defaults.set(array, forKey: "SavedStringArray")
Recuperar matriz
let defaults = UserDefaults.standard let myarray = defaults.stringArray(forKey: "SavedStringArray") ?? [String]()
Int matriz
Guardar matriz
let array = [15, 33, 36, 723, 77, 4] let defaults = UserDefaults.standard defaults.set(array, forKey: "SavedIntArray")
Recuperar matriz
let defaults = UserDefaults.standard let array = defaults.array(forKey: "SavedIntArray") as? [Int] ?? [Int]()
Matriz bool
Guardar matriz
let array = [true, true, false, true, false] let defaults = UserDefaults.standard defaults.set(array, forKey: "SavedBoolArray")
Recuperar matriz
let defaults = UserDefaults.standard let array = defaults.array(forKey: "SavedBoolArray") as? [Bool] ?? [Bool]()
Matriz de fechas
Guardar matriz
let array = [Date(), Date(), Date(), Date()] let defaults = UserDefaults.standard defaults.set(array, forKey: "SavedDateArray")
Recuperar matriz
let defaults = UserDefaults.standard let array = defaults.array(forKey: "SavedDateArray") as? [Date] ?? [Date]()
Matriz de objetos
Los objetos personalizados (y en consecuencia las matrices de objetos) requieren un poco más de trabajo para guardar
UserDefaults
. Consulte los siguientes enlaces para saber cómo hacerlo.Notas
??
) le permite devolver la matriz guardada o una matriz vacía sin fallar. Significa que si el objeto devuelve nil,??
se utilizará en su lugar el valor que sigue al operador.Int
,Bool
yDate
. También lo probé conDouble
. Hasta donde yo sé, cualquier cosa que pueda guardar en una lista de propiedades funcionará así.fuente
Solo para agregar a lo que dice @Zaph en los comentarios.
Tengo el mismo problema que tú, como para saber, la matriz de
String
no se guarda. Aunque Apple puentea tipos como String y NSString, no pude guardar una matriz de[String]
ninguno de[AnyObject]
.Sin embargo, una serie de
[NSString]
trabajos para mí.Entonces su código podría verse así:
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] }
Tenga en cuenta que creé una matriz de NSString y no un diccionario. No verifiqué si funciona con un diccionario, pero probablemente tendrás que definir las cosas
[NSString : NSString]
para que funcione.EDITAR
Releyendo tu pregunta y tu título, estás hablando
array of array
. Creo que mientras te quedes conNSString
, una matriz de matriz funcionará. Sin embargo, si cree que mi respuesta es irrelevante, hágamelo saber en los comentarios y la eliminaré.fuente
Aquí hay un ejemplo de lectura y escritura de una lista de objetos de tipo
SNStock
que implementaNSCoding
: tenemos un descriptor de acceso para toda la listawatchlist
, y dos métodos para agregar y eliminar objetos, es decir,addStock(stock: SNStock)
yremoveStock(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 } } }
Recuerde que su objeto debe implementarse
NSCoding
o, de lo contrario, la codificación no funcionará. Así es como seSNStock
ve: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 } }
¡Espero que esto ayude!
fuente
Prueba esto.
Para obtener los datos de 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)
fuente
Swift 4.0
Tienda:
let arrayFruit = ["Apple","Banana","Orange","Grapes","Watermelon"] //store in user default UserDefaults.standard.set(arrayFruit, forKey: "arrayFruit")
Ir a buscar:
if let arr = UserDefaults.standard.array(forKey: "arrayFruit") as? [String]{ print(arr) }
fuente
Aquí está:
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 }
fuente
Si está trabajando con Swift 5+ , debe usar
UserDefaults.standard.setValue(value, forKey: key)
y para obtener los datos guardados, debe usarUserDefaults.standard.dictionary(forKey: key)
.fuente