仅当未全新安装应用程序时,才能将__NSCFDictionary类型的值强制转换为NSData

时间:2019-05-13 17:26:24

标签: swift nsdata

当此代码在全新的应用程序安装上运行时,它可以很好地工作。但是,如果以前没有任何数据保存在设备上,则此功能会导致应用崩溃。

我收到错误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 :(得分:0)

第一次工作是因为test1.csv在开始时为零

playlistsData

您应该将对象存储在 let playlistsData = defaults.object(forKey: "user_playlists") >>>>>> hereis the crash >>>>> playlistsData as! Data 中,而不要使用{p>

Data

答案 1 :(得分:0)

为了安全地获取数据,请将方法更改为

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中,所以发生错误的方式。

您可能是说但是,当先前已保存 数据时 ...