Bool верхнего уровня, закодированный как фрагмент списка свойств номера. PropertyListEncoder - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть эта универсальная функция для сохранения в NSUserDefaults, обычно она работает, но теперь я хочу сохранить логическое значение и получаю ошибку. Я ничего не смог найти и не понимаю, почему это не работает.

extension UserDefaults {
    func saveUserDefaults<T: Codable>(withKey key: String, myType: T) throws{
        do {
            let data = try PropertyListEncoder().encode(myType)
            UserDefaults.standard.set(data, forKey: key)
            print("Saved for Key:", key)
        } catch let error {

            print("Save Failed")
            throw error
        }
    }

Я называю это так:

try! UserDefaults().saveUserDefaults(withKey: "String", myType: false)

Это ошибка, которую я получаю. Я знаю, что есть другой способ сохранить логические значения, но мне интересно, почему он не работает так?

Тема 1: Неустранимая ошибка: 'попробуй!' Выражение неожиданно вызвало ошибку: Swift.EncodingError.invalidValue (ложь, Swift.EncodingError.Context (codingPath: [], debugDescription: Msgstr "Bool верхнего уровня, закодированный как фрагмент списка свойств числа.", underError: nil))

Спасибо!

Ответы [ 2 ]

0 голосов
/ 22 мая 2019

Как сказал @Martin, PropertyListEncoder поддерживает только списки свойств на верхнем уровне, но не один фрагмент списка свойств, такой как NSNumber. Очень простой (хотя и не очень элегантный) обходной путь - заключить любой объект в массив:

let data = try PropertyListEncoder().encode([myType])
UserDefaults.standard.set(data, forKey: key)

И расшифровать его как:

let arr = try  PropertyListDecoder().decode([T].self, from: data)
return arr.first

см. https://www.marisibrothers.com/2018/07/workaround-for-serializing-codable-fragments.html

0 голосов
/ 06 ноября 2018

A PropertyListEncoder кодируется в «список свойств», и это всегда массив или словарь, сравните PropertyListSerialization .

Следовательно

let data = try PropertyListEncoder().encode(myType)

терпит неудачу, если myType является Bool (или чем-то, что не является массивом или словарь).

Возможные объекты в списке свойств также ограничены, они могут быть только экземплярами NSData, NSString, NSArray, NSDictionary, NSDate или NSNumber - или типа Swift которые соединены с одним из этих типов Фонда.

...