我想在UserDefaults中保存我的元组数组。但是,当我这样做时,它不起作用。
var tupelArray = [(Name: String, Age: Int)]()
发布于 2018-09-07 13:40:30
你真的不应该使用userDefaults存储自定义对象等,而是使用CoreData或类似的选择。使用userDefaults存储小数据,也可以使用常规应用程序首选项。更多信息,请看这里。
如果你真的想存储这个元组数组,那么你可以分别存储一个名字数组和一个年龄数组,并在你想要检索它们时将它们压缩在一起:
typealias MyTuple = (Name: String, Age: Int) //Just for convenience
let tupleArray: [MyTuple] = [(Name: "Thomas", Age: 20),
(Name: "Nicolas", Age: 30),
(Name: "Andreas", Age: 40)]
要存储tupleArray
调用此功能:
saveTuples(array: tupleArray)
其定义如下:
func saveTuples(array: [MyTuple]) {
let names = array.map{$0.Name}
let ages = array.map{$0.Age}
UserDefaults.standard.set(names, forKey: "namesArray")
UserDefaults.standard.set(ages, forKey: "agesArray")
}
要检索tupleArray
,这个代码片段会派上用场:
let namesArray = UserDefaults.standard.object(forKey: "namesArray") as! [String]
let agesArray = UserDefaults.standard.object(forKey: "agesArray") as! [Int]
let retrievedTupleArray = zip(namesArray, agesArray).map {(Name: $0.0, Age: $0.1)}
retrievedTupleArray.forEach {print($0)}
发布于 2018-09-07 14:17:55
保存像你当前所做的那样的元组数组就像试图存储一组自定义对象而不编码/解码|| 存档/取消存档,所以你想要的
struct Item : Codable {
let name:String
let age:Int
}
//
let arr = [Item(name: "hfhfh", age: 23)]
do {
let data = try JSONEncoder().encode(arr)
UserDefaults.standard.set(data, forKey: "kkk")
let storedData = UserDefaults.standard.data(forKey: "kkk")
let arr = try JSONDecoder().decode([Item].self, from: storedData!)
print(arr)
}
catch {
print(error)
}
https://stackoverflow.com/questions/-100002583
复制相似问题