如何在NSUserdefaults中快速保存和读取数组的数组?

我需要创建一个数组来添加具有这种格式的对象,例如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"))

}


扬帆大鱼
浏览 1000回答 3
3回答

莫回无

这个问题的意思是“数组数组”,但我认为大多数人可能只是想知道如何将数组保存到UserDefaults。对于那些人,我将添加一些常见示例。字符串数组保存数组let array = ["horse", "cow", "camel", "sheep", "goat"]let defaults = UserDefaults.standarddefaults.set(array, forKey: "SavedStringArray")检索数组let defaults = UserDefaults.standardlet myarray = defaults.stringArray(forKey: "SavedStringArray") ?? [String]()整数数组保存数组let array = [15, 33, 36, 723, 77, 4]let defaults = UserDefaults.standarddefaults.set(array, forKey: "SavedIntArray")检索数组let defaults = UserDefaults.standardlet array = defaults.array(forKey: "SavedIntArray")  as? [Int] ?? [Int]()布尔数组保存数组let array = [true, true, false, true, false]let defaults = UserDefaults.standarddefaults.set(array, forKey: "SavedBoolArray")检索数组let defaults = UserDefaults.standardlet array = defaults.array(forKey: "SavedBoolArray")  as? [Bool] ?? [Bool]()日期数组保存数组let array = [Date(), Date(), Date(), Date()]let defaults = UserDefaults.standarddefaults.set(array, forKey: "SavedDateArray")检索数组let defaults = UserDefaults.standardlet array = defaults.array(forKey: "SavedDateArray")  as? [Date] ?? [Date]()对象数组自定义对象(以及对象的数组)需要做更多的工作才能保存到UserDefaults。请参阅以下链接以了解操作方法。将自定义对象保存到NSUserDefaults中用于将颜色保存为UserDefaults的文档尝试将非属性列表对象设置为NSUserDefaults笔记使用nil合并运算符(??),您可以返回保存的数组或空数组而不会崩溃。这意味着如果对象返回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")//savevar defaults = NSUserDefaults.standardUserDefaults()defaults.setObject(array1, forKey: key)defaults.synchronize()//readif let testArray : AnyObject? = defaults.objectForKey(key) {    var readArray : [NSString] = testArray! as [NSString]}请注意,我创建了一个NSString数组,而不是一个字典。我没有检查它是否适用于字典,但是可能您必须定义一些东西[NSString : NSString]才能使其工作。编辑重新阅读您的问题和标题,您正在谈论array of array。我认为,只要您继续使用NSString,数组数组就可以工作。但是,如果您认为我的答案无关紧要,请在评论中让我知道,然后我将其删除。

RISEBY

这是一个读写SNStock实现类型的对象列表的示例NSCoding-我们有一个用于整个列表的访问器watchlist,以及两个添加和删除对象的方法,即addStock(stock: SNStock)和removeStock(stock: SNStock)。import Foundationclass 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 Foundationclass 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  }}希望这可以帮助!
打开App,查看更多内容
随时随地看视频慕课网APP