Не удалось привести значение типа __NSCFDictionary к NSData, только если приложение не установлено заново - PullRequest
0 голосов
/ 13 мая 2019

Когда этот код запускается при новой установке приложения, он работает отлично.Однако, если на устройстве ранее не было сохранено данных, эта функция вызывает сбой приложения.

Я получаю сообщение об ошибке Could not cast value of type __NSCFDictionary to NSData и возвращает сообщение об ошибке ноля потока в следующей строке:

playlists = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(playlistsData as! Data) as! [String:[Song]]

Вот мой полный код функции ниже:

func getPlaylists() -> [String:[Song]] {
        var playlists: [String:[Song]] = [:]
        let playlistsData = defaults.object(forKey: "user_playlists")
        if playlistsData != nil {
            playlists = try! NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(playlistsData as! Data) as! [String:[Song]]
        }

        return playlists
    }

Ответы [ 2 ]

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

Для безопасного получения данных измените метод на

func getPlaylists() -> [String:[Song]] {
    guard let playlistsData = defaults.data(forKey: "user_playlists"),
          let playlists = try? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(playlistsData) as? [String:[Song]] else { return [:] }
    return playlists
}

Кстати, ошибка возникает из-за того, что вы ранее сохранили словарь в UserDefaults вместо Data.

Youвероятно, означает Однако, когда это ранее сохраненные данные ...

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

Первый раз работает как playlistsData в начале ноль

 let playlistsData = defaults.object(forKey: "user_playlists")

  >>>>>>   hereis the crash  >>>>> playlistsData as! Data

Вы должны хранить объект в Data не как Dictionary с

guard let data = try? NSKeyedArchiver.archivedData(withRootObject: somethingToSave, requiringSecureCoding: false) else { return }
defaults.set(data,forKey:"user_playlists")
...