我有一个类型为[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) }