【发布时间】:2018-12-31 10:14:40
【问题描述】:
自从升级到 Swift 4.2 后,我发现许多 NSKeyedUnarchiver 和 NSKeyedArchiver 方法已被弃用,我们现在必须使用类型方法 static func unarchivedObject<DecodedObjectType>(ofClass: DecodedObjectType.Type, from: Data) -> DecodedObjectType? 来取消归档数据。
我已经成功地归档了我的定制类 WidgetData 的一个数组,它是一个 NSObject 子类:
private static func archiveWidgetDataArray(widgetDataArray : [WidgetData]) -> NSData {
guard let data = try? NSKeyedArchiver.archivedData(withRootObject: widgetDataArray as Array, requiringSecureCoding: false) as NSData
else { fatalError("Can't encode data") }
return data
}
当我尝试取消归档这些数据时,问题就来了:
static func loadWidgetDataArray() -> [WidgetData]? {
if isKeyPresentInUserDefaults(key: USER_DEFAULTS_KEY_WIDGET_DATA) {
if let unarchivedObject = UserDefaults.standard.object(forKey: USER_DEFAULTS_KEY_WIDGET_DATA) as? Data {
//THIS FUNCTION HAS NOW BEEN DEPRECATED:
//return NSKeyedUnarchiver.unarchiveObject(with: unarchivedObject as Data) as? [WidgetData]
guard let nsArray = try? NSKeyedUnarchiver.unarchivedObject(ofClass: NSArray.self, from: unarchivedObject as Data) else {
fatalError("loadWidgetDataArray - Can't encode data")
}
guard let array = nsArray as? Array<WidgetData> else {
fatalError("loadWidgetDataArray - Can't get Array")
}
return array
}
}
return nil
}
但这失败了,因为不允许使用Array.self 而不是NSArray.self。我做错了什么,如何解决这个问题以取消归档我的数组?
【问题讨论】:
-
检查这个以获得更快速的解决方案stackoverflow.com/a/51460950/5820010
-
什么“失败”?你得到什么输出?你没有在任何地方使用
Array.self。 -
当更改为 Array.self 而不是 NSArray.self 时,预编译器会报错: Incorrect argument label in call (have 'ofClass:from:', expected 'ofClasses:from:') Replace ' ofClass' 与 'ofClasses'。这意味着 Array.self 不能使用。当我使用 NSArray.self 时,它可以毫无问题地编译并运行。但是被致命错误捕获,因为结果 'nsArray' 为 nil。
-
那么,当您使用
NSKeyedUnarchiver.unarchivedObject(ofClasses: [Array<WidgetData>.self], from: unarchivedObject as Data)时会发生什么?另外,不要使用try?,而是使用do/try/catch,这样您就可以打印发生的实际错误。 -
守卫让 unarchivedFavorites = 试试? NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(favoritesData!) else { return } self.channelFavorites = unarchivedFavorites as! [频道收藏]
标签: ios swift nskeyedunarchiver ios12