在 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) }