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

时间:2014-08-07 10:06:18

标签: swift nsuserdefaults xcode6

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

8 个答案:

答案 0 :(得分:144)

问题是"数组数组"但我想大多数人可能只是想知道如何将数组保存到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合并运算符(??)允许您返回已保存的数组或空数组而不会崩溃。这意味着如果对象返回nil,则将使用??运算符后面的值。
  • 如您所见,IntBoolDate的基本设置相同。我还用Double测试了它。据我所知,你可以保存在属性列表中的任何东西都可以这样工作。

答案 1 :(得分:15)

只是添加@Zaph在评论中所说的内容。

我和你有同样的问题,因为我知道String的数组没有保存。尽管Apple桥接了String和NSString等类型,但我无法保存[String]的{​​{1}}数组。

然而,[AnyObject]数组对我有用。

所以你的代码看起来像那样:

[NSString]

请注意,我创建了一个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]。我认为只要你留在array of array,一个数组就可以了。但是,如果您认为我的答案无关紧要,请在评论中告诉我,我会将其删除。

答案 2 :(得分:10)

以下是读取和编写实现SNStock的{​​{1}}类型对象列表的示例 - 我们有一个整个列表的访问者NSCoding和两个要添加的方法并删除watchlistaddStock(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

希望这有帮助!

答案 3 :(得分:2)

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

答案 4 :(得分:1)

试试这个。

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

答案 5 :(得分: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 
}

答案 6 :(得分:0)

************最简单的方法***********

雨燕5

设置

 var array1: [String] = []
 array1.append(testEventGroup.id!)
 UserDefaults.standard.set(array1, forKey : "arrTEGIDS")

检索

let testArray = UserDefaults.standard.object(forKey: "arrTEGIDS")

答案 7 :(得分:0)

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