Ошибка Userdefault при попытке установить объект, не относящийся к списку свойств - PullRequest
0 голосов
/ 20 июня 2020

Я попытался сохранить массив в UserDefault, но получил ошибку при попытке установить объект, не относящийся к списку свойств. Я знаю, как использовать UserDefault с прошлого года, но в настоящее время для меня что-то ново, что у меня не было опыта сохранения массива с несколькими строками. Как лучше всего сохранить массив в UserDefaults? Я пробовал поискать в Интернете, но большинство из них старые быстрые и не похожи на мой массив. Вот мой код:

var currentWeatherUnit: [(temperature:String, measurement:String)])] = []

func checkingForSetting(completion: @escaping (() -> Void)) {
   if let getsetting = UserDefaults.standard.array(forKey: "Current Weather Setting") {
      currentWeatherUnit = getsetting as! [(temperature: String, measurement: String)]
      print("Current weather setting is exist")
   } else {
   currentWeatherUnit = [(temperature: "C", measurement: "mm")]
      UserDefaults.standard.set(currentWeatherUnit, forKey: "Current Weather Setting")
      print("Create new setting for current weather")
   }
}

Cra sh Log:

2020-06-19 16: 32: 17.354822-0600 Playground Phy [5800: 1787752] [Пользовательские настройки по умолчанию ] Попытка установить объект без списка свойств ("(температура: \" C \ ", измерение: \" мм \ ")") в качестве значения NSUserDefaults / CFPreferences для ключа Current Weather Setting 2020-06-19 16: 32: 17.355108-0600 Playground Phy [5800: 1787752] * Завершение работы приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: 'Попытка вставить объект списка, не относящегося к свойствам ("(температура: \" C \ ", измерение: \ "мм \")») для ключа Текущая погода Установка» * Первый бросок стека вызовов: (0x193cda300 0x1939eec1 c 0x193d335a8 0x193d07ab4 0x193d08190 0x193d07e7 c 0x193d08250 0x193baffb0 0x193d10838 0x193c403b c 0x193c3fc04 0x193bac83 c 0x193baf9d4 0x193d13cc8 0x193fda118 0x104464dc0 0x104464140 0x104464928 0x1977b0aa c 0x1977b5660 0x1977b5a4 c 0x197e5c264 0x197e5b960 0x197e5c8f0 0x197e719e3db4 0x197e619e8322 * 0x197e6e19e2 * 0x197e619e2 ​​* 0x197e6e19e2 * 0x198 0 0x1979a1e08 0x198f3cff c 0x198f635a0 0x198f47eb * * 0x198f63234 тысячу двадцать-один 0x1049d718 c 0x1049da964 0x198f896c4 0x198f89370 0x198f898d c 0x193c55af4 0x193c55a48 0x193c55198 0x193c4ff38 0x193c4f8f4 0x19e066604 0x197e23358 0x10446bae c 0x193acb2d c) Libc ++ abi.dylib: завершение с неперехваченным исключением типа NSException

1 Ответ

1 голос
/ 20 июня 2020

Внимательно прочтите сообщение об ошибке, оно довольно ясное.

Завершение работы приложения из-за неперехваченного исключения 'NSInvalidArgumentException', причина: 'Попытка вставить объект списка, не относящегося к свойствам ("(temperature: \ "C \", размер: \ "mm \") ") для ключа Current Weather Setting '

Объект списка - это кортеж , который не соответствует списку свойств.

Разумным решением является настраиваемая структура и Codable, обработчик завершения бессмыслен, потому что UserDefaults синхронный.

struct WeatherUnit : Codable {
    let temperature, measurement : String
}

var currentWeatherUnit = [WeatherUnit]()

func checkingForSetting() {
    if let data = UserDefaults.standard.data(forKey: "Current Weather Setting") {
        do {
            currentWeatherUnit = try PropertyListDecoder().decode([WeatherUnit].self, from: data)
            print("Current weather setting is exist")
        } catch { print(error) }
    } else {
        currentWeatherUnit = [WeatherUnit(temperature: "C", measurement: "mm")]
        let data = try? PropertyListEncoder().encode(currentWeatherUnit)
        UserDefaults.standard.set(data, forKey: "Current Weather Setting")
        print("Create new setting for current weather")
    }
}
...