3 回答
TA贡献1865条经验 获得超7个赞
这个问题的意思是“数组数组”,但我认为大多数人可能只是想知道如何将数组保存到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]()
整数数组
保存数组
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]()
布尔数组
保存数组
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。请参阅以下链接以了解操作方法。
将自定义对象保存到NSUserDefaults中
用于将颜色保存为UserDefaults的文档
尝试将非属性列表对象设置为NSUserDefaults
笔记
使用nil合并运算符(??),您可以返回保存的数组或空数组而不会崩溃。这意味着如果对象返回nil,则将??使用运算符后的值代替。
正如你所看到的,基本设置是为同一个Int,Bool和Date。我也用进行了测试Double。据我所知,您可以保存在属性列表中的所有内容都将像这样工作。
TA贡献1772条经验 获得超5个赞
只是添加到@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,数组数组就可以工作。但是,如果您认为我的答案无关紧要,请在评论中让我知道,然后我将其删除。
TA贡献1856条经验 获得超5个赞
这是一个读写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
}
}
希望这可以帮助!
- 3 回答
- 0 关注
- 996 浏览
添加回答
举报