一尘不染

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

swift

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

阅读 331

收藏
2020-07-07

共1个答案

一尘不染

这个问题的意思是“数组数组”,但是我想大多数人可能只是想知道如何将数组保存到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。据我所知,可以保存在属性列表中的任何内容都将像这样工作。
2020-07-07