在 userdefaults 中存储字典时尝试插入非 属性 列表对象错误
Attempt to insert non-property list object error while storing dictionary in userdefaults
我有一本 [Int: [Int]]
类型的字典,我想将它存储在用户默认值中。
字典的键是这样的:1100110004
和值:
[1,2,0,0]
但是我得到了这个错误:
Attempt to insert non-property list object {\n 1100110004 = (\n 1,\n 2,\n 0,\n 0\n );\n} for key
visibleChart1100110004"
这是我的代码:
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: {[=13=] == .ecg}) {
chartTypeInt.remove(at: index)
chartTypeInt.insert(ecgNumber, at: index)
}
//respiratory
if let index = chartType.firstIndex(where: {[=13=] == .respiratory}) {
chartTypeInt.remove(at: index)
chartTypeInt.insert(respiratoryNumber, at: index)
}
//body temp
if let index = chartType.firstIndex(where: {[=13=] == .bodyTemp}) {
chartTypeInt.remove(at: index)
chartTypeInt.insert(bodyTempNumber, at: index)
}
//activity
if let index = chartType.firstIndex(where: {[=13=] == .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
是可编码的,因此将 it 编码为 属性 列表并将生成的数据对象存储在用户默认值中.
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) }
我有一本 [Int: [Int]]
类型的字典,我想将它存储在用户默认值中。
字典的键是这样的:1100110004
和值:
[1,2,0,0]
但是我得到了这个错误:
Attempt to insert non-property list object {\n 1100110004 = (\n 1,\n 2,\n 0,\n 0\n );\n} for key visibleChart1100110004"
这是我的代码:
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: {[=13=] == .ecg}) {
chartTypeInt.remove(at: index)
chartTypeInt.insert(ecgNumber, at: index)
}
//respiratory
if let index = chartType.firstIndex(where: {[=13=] == .respiratory}) {
chartTypeInt.remove(at: index)
chartTypeInt.insert(respiratoryNumber, at: index)
}
//body temp
if let index = chartType.firstIndex(where: {[=13=] == .bodyTemp}) {
chartTypeInt.remove(at: index)
chartTypeInt.insert(bodyTempNumber, at: index)
}
//activity
if let index = chartType.firstIndex(where: {[=13=] == .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
是可编码的,因此将 it 编码为 属性 列表并将生成的数据对象存储在用户默认值中.
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) }