Мне нужно создать массив для добавления объектов с этим форматом, например словаря в Swift: ["key1": "value1", "key2": "value2"]
Когда я пытаюсь сохранить NSUserDefaults
все правильно, но при чтении NSUserDefaults
с ключом происходит сбой. Какие данные нужны моему 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
источник
источник
Ответы:
Вопрос гласит: «массив массивов», но я думаю, что большинство людей, вероятно, приходят сюда просто чтобы узнать, как сохранить массив в
UserDefaults
. Для этих людей я добавлю несколько общих примеров.Строковый массив
Сохранить массив
let array = ["horse", "cow", "camel", "sheep", "goat"] let defaults = UserDefaults.standard defaults.set(array, forKey: "SavedStringArray")
Получить массив
let defaults = UserDefaults.standard let myarray = defaults.stringArray(forKey: "SavedStringArray") ?? [String]()
Int массив
Сохранить массив
let array = [15, 33, 36, 723, 77, 4] let defaults = UserDefaults.standard defaults.set(array, forKey: "SavedIntArray")
Получить массив
let defaults = UserDefaults.standard let array = defaults.array(forKey: "SavedIntArray") as? [Int] ?? [Int]()
Массив Bool
Сохранить массив
let array = [true, true, false, true, false] let defaults = UserDefaults.standard defaults.set(array, forKey: "SavedBoolArray")
Получить массив
let defaults = UserDefaults.standard let array = defaults.array(forKey: "SavedBoolArray") as? [Bool] ?? [Bool]()
Массив дат
Сохранить массив
let array = [Date(), Date(), Date(), Date()] let defaults = UserDefaults.standard defaults.set(array, forKey: "SavedDateArray")
Получить массив
let defaults = UserDefaults.standard let array = defaults.array(forKey: "SavedDateArray") as? [Date] ?? [Date]()
Массив объектов
Пользовательские объекты (и, следовательно, массивы объектов) требуют немного больше работы для сохранения
UserDefaults
. См. Следующие ссылки, чтобы узнать, как это сделать.Ноты
??
) позволяет возвращать сохраненный массив или пустой массив без сбоев. Это означает, что если объект возвращает nil, то??
вместо него будет использоваться значение, следующее за оператором.Int
,Bool
иDate
. Я также тестировал это с помощьюDouble
. Насколько мне известно, все, что вы можете сохранить в списке свойств, будет работать так.источник
Просто чтобы добавить к тому, что @Zaph говорит в комментариях.
У меня такая же проблема, как и у вас, как знать, массив
String
не сохраняется. Несмотря на то, что Apple связывает такие типы, как String и NSString, мне не удалось сохранить массив[String]
ни одного из[AnyObject]
.Однако
[NSString]
у меня масса работ.Итак, ваш код может выглядеть так:
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] }
Обратите внимание, что я создал массив NSString, а не словарь. Я не проверял, работает ли он со словарем, но, вероятно, вам придется определить вещи,
[NSString : NSString]
чтобы он работал.РЕДАКТИРОВАТЬ
Вы имеете в виду, перечитывая свой вопрос и название
array of array
. Я думаю, что пока вы остаетесь сNSString
, массив массивов будет работать. Однако, если вы считаете, что мой ответ неуместен, просто дайте мне знать в комментариях, и я удалю его.источник
Вот пример чтения и записи списка объектов типа,
SNStock
который реализуетNSCoding
- у нас есть средство доступа для всего спискаwatchlist
, и два метода для добавления и удаления объектов, то естьaddStock(stock: SNStock)
и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 } } }
Помните, что ваш объект необходимо реализовать,
NSCoding
иначе кодировка не будет работать. Вот как это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 } }
Надеюсь это поможет!
источник
Попробуй это.
Чтобы получить данные из файла 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)
источник
Swift 4.0
Хранить:
let arrayFruit = ["Apple","Banana","Orange","Grapes","Watermelon"] //store in user default UserDefaults.standard.set(arrayFruit, forKey: "arrayFruit")
Получить:
if let arr = UserDefaults.standard.array(forKey: "arrayFruit") as? [String]{ print(arr) }
источник
Вот:
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 }
источник
Если вы работаете со Swift 5+, вам нужно использовать,
UserDefaults.standard.setValue(value, forKey: key)
а для получения сохраненных данных вы должны использоватьUserDefaults.standard.dictionary(forKey: key)
.источник