Попытка вставить ошибку объекта списка не свойств при сохранении словаря в пользовательских ошибках - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть словарь с типом [Int: [Int]], я хочу сохранить его по умолчанию. Ключ словаря выглядит так: 1100110004 и значение:

[1,2,0,0]

Но я получил эту ошибку:

Попытка вставить объект списка не свойств {\ n 1100110004 = (\ n 1, \ n 2, \ n 0, \ n 0 \ n); \ n} для ключа 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: {$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
   }

Может ли кто-нибудь помочь мне в этом?

1 Ответ

0 голосов
/ 13 апреля 2020

Пользователь по умолчанию - это список свойств. Словари со списком свойств должны иметь строковые ключи.

Вы всегда можете проверить соответствие чего-либо, что будет добавлено непосредственно в пользовательские настройки по умолчанию, например:

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 является Codable, поэтому закодируйте 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) }
...