gpt4 book ai didi

ios - 使用 NSKeyedUnarchiver unarchivedObject(ofClass :from:)) 取消归档数组

转载 作者:IT王子 更新时间:2023-10-29 05:45:57 41 4
gpt4 key购买 nike

自升级到 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是不允许的。我做错了什么,如何解决这个问题以取消归档我的阵列?

最佳答案

您可以使用 unarchiveTopLevelObjectWithData(_:) 取消归档由 archivedData(withRootObject:requiringSecureCoding:) 归档的数据。 (我相信这还没有被弃用。)

但是在展示一些代码之前,你最好:

  • 避免使用NSData,改用Data

  • 避免使用 try? 来处理对调试有用的错误信息

  • 删除所有不需要的转换


试试这个:

private static func archiveWidgetDataArray(widgetDataArray : [WidgetData]) -> Data {
do {
let data = try NSKeyedArchiver.archivedData(withRootObject: widgetDataArray, requiringSecureCoding: false)

return data
} catch {
fatalError("Can't encode data: \(error)")
}

}

static func loadWidgetDataArray() -> [WidgetData]? {
guard
isKeyPresentInUserDefaults(key: USER_DEFAULTS_KEY_WIDGET_DATA), //<- Do you really need this line?
let unarchivedObject = UserDefaults.standard.data(forKey: USER_DEFAULTS_KEY_WIDGET_DATA)
else {
return nil
}
do {
guard let array = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(unarchivedObject) as? [WidgetData] else {
fatalError("loadWidgetDataArray - Can't get Array")
}
return array
} catch {
fatalError("loadWidgetDataArray - Can't encode data: \(error)")
}
}

但如果您正在制作新应用,您最好考虑使用 Codable

关于ios - 使用 NSKeyedUnarchiver unarchivedObject(ofClass :from:)) 取消归档数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51487622/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com