При запуске приложения происходит сбой при загрузке цветов из UserDefaults (Swift) - PullRequest
0 голосов
/ 24 июня 2018

Мое приложение падает, когда я запускаю его на устройстве.

При запуске все мои массивы пусты.

Ошибка:

Поток 1: фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения swift

enter image description here

Как я могу это исправить?

var CName: [String] = [""]

var BarCode: [String] = [""]
var CardNBR: [String] = [""]

var CardColorLogo = [UIColor]()

var UploadDateArray = [NSDate]()

var Comment: [String] = [""]

Функция сохранения и загрузки

func saveColorLogo() {
    UserDefaults.standard.set(NSKeyedArchiver.archivedData(withRootObject: CardColorLogo), forKey: "ColorsKey")
}

func loadColorLogo() {
    let decodedColorsData = UserDefaults.standard.object(forKey: "ColorsKey") as? NSData
    let colorsArray = (NSKeyedUnarchiver.unarchiveObject(with: decodedColorsData! as  Data) as! NSArray)
    CardColorLogo = colorsArray as! [UIColor]
}

1 Ответ

0 голосов
/ 24 июня 2018

Прежде всего, пожалуйста, соблюдайте соглашение об именах, согласно которому имена переменных начинаются со строчной буквы, например

var cardColorLogo = [UIColor]()

Во-вторых, не используйте NSData и NSArray в Swift. Существуют нативные типы.

Любой небрежно написанный восклицательный знак может привести к сбою приложения .

Ошибка возникает потому, что object(forKey возвращает nil, если ключ не существует. Кстати, есть метод data(forKey с таким же поведением.

Необязательно: привязать результат и вернуть пустой массив при ошибке

func loadColorLogo() {
    if let decodedColorsData = UserDefaults.standard.data(forKey: "ColorsKey"),
        let colorsArray = NSKeyedUnarchiver.unarchiveObject(with: decodedColorsData) as? [UIColor] {
        cardColorLogo = colorsArray
    } else {
        cardColorLogo = []
    }
}
...