在用户默认值中存储字典时,尝试插入非属性列表对象时出错



我有一个类型为[Int: [Int]]的字典,我想以用户默认值存储它。字典的关键字是这样的:1100110004和值:

[1,2,0]

但我得到了这个错误:

尝试为键插入非属性列表对象{\n 1100110004=(\n 1,\n 2,\n 0,\n 0\n(;\n}可视图表1100110004">

这是我的代码:

let userDefaults = UserDefaults.standard
private lazy var visibleChartDictionary = [Int: [Int]]()

并且在一个函数中:

visibleChartDictionary = [id :  convertChartTypetoInt(chartType: visibleCharts)]
chartUserDefaults.set(visibleChartDictionary, forKey: "visibleChart(id)")

这里有一个函数可以将数据模型转换为Int(我读到我不能将数据模型类型存储在用户默认值中(

func convertChartTypetoInt(chartType:[ChartType]) -> [Int] {
var chartTypeInt: [Int] = [0, 0 , 0, 0]
let ecgNumber = 1
let respiratoryNumber = 2
let bodyTempNumber = 3
let activityNumber = 4
//ecg
if let index = chartType.firstIndex(where: {$0 == .ecg}) {
chartTypeInt.remove(at: index)
chartTypeInt.insert(ecgNumber, at: index)
}
//respiratory
if let index = chartType.firstIndex(where: {$0 == .respiratory}) {
chartTypeInt.remove(at: index)
chartTypeInt.insert(respiratoryNumber, at: index)
}
//body temp
if let index = chartType.firstIndex(where: {$0 == .bodyTemp}) {
chartTypeInt.remove(at: index)
chartTypeInt.insert(bodyTempNumber, at: index)
}
//activity
if let index = chartType.firstIndex(where: {$0 == .activity}) {
chartTypeInt.remove(at: index)
chartTypeInt.insert(activityNumber, at: index)
}
return chartTypeInt
}

有人能帮我吗?

用户默认值是一个属性列表。属性列表字典必须具有字符串键。

您可以随时测试要直接放入用户默认值的东西的资格,如下所示:

let d : [Int:[Int]] = [1100110004 : [1,2,0,0]]
do {
let data = try PropertyListSerialization.data(
fromPropertyList: d, format: .binary, options: 0)
} catch { print(error) }

一个简单而明显的解决方案:您的d是可编码的,因此将编码到属性列表中,并将生成的Data对象存储在用户默认值中。

let d : [Int:[Int]] = [1100110004 : [1,2,0,0]]
do {
let data = try PropertyListEncoder().encode(d)
// and store `data` in user defaults
} catch { print(error) }

最新更新