簡體   English   中英

嘗試在 userdefaults 中存儲字典時插入非屬性列表 object 錯誤

[英]Attempt to insert non-property list object error while storing dictionary in userdefaults

我有一個類型為[Int: [Int]]的字典,我想將它存儲在用戶默認值中。 字典的鍵是這樣的: 1100110004和值:

[1,2,0,0]

但我得到了這個錯誤:

嘗試插入非屬性列表 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]]()

在 function 中:

visibleChartDictionary = [id :  convertChartTypetoInt(chartType: visibleCharts)]

 chartUserDefaults.set(visibleChartDictionary, forKey: "visibleChart\(id)")

這里有一個 function 將數據 model 轉換為 Int (我讀到我無法在用戶默認值中存儲數據 model 類型)

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是可編碼的,因此將編碼為屬性列表並將生成的數據 object 存儲在用戶默認值中。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM