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


79

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

3
看来NSUserDefaults可以处理字符串,但不能处理数组和字典,仅适用于描述文档的NS *类型。因此,这看起来像Swift中的错误。
zaph 2014年

为了超越@Zaph所说的内容,我使用[String]进行了测试,但它不起作用,但它与[NSString]一起使用。检查我的答案。
HpTerm

Answers:


207

这个问题的意思是“数组数组”,但我想大多数人可能只是想知道如何将数组保存到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。请参阅以下链接以了解操作方法。

笔记

  • 使用nil合并运算符(??),您可以返回保存的数组或空数组而不会崩溃。这意味着如果对象返回nil,则将??使用运算符后的值代替。
  • 正如你所看到的,基本设置是为同一个IntBoolDate。我也用进行了测试Double。据我所知,您可以保存在属性列表中的所有内容都将像这样工作。

16

只是添加到@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,数组数组就可以工作。但是,如果您认为我的答案无关紧要,请在评论中让我知道,然后我将其删除。


11

这是一个读写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

试试这个。

从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)

我添加了var dict:[AnyObject!] = []和var array1:NSArray = dict,但这是空的,如何才能使其正确?
user3745888 2014年

@AlvinVarghese实际上尝试代码。有一个错别字,即使固定了错别字,保存的唯一内容是一个只有一个条目的数组:“值”。
zaph 2014年

3

迅捷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)
    }

1

这是:

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 
}

0

如果您使用的是Swift 5+,则必须使用,UserDefaults.standard.setValue(value, forKey: key)并且必须使用来获取保存的数据UserDefaults.standard.dictionary(forKey: key)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.