提问人:Jordan H 提问时间:3/4/2023 最后编辑:Jordan H 更新时间:4/15/2023 访问量:1308
当数据是字典时,如何将NSKeyedUnarchiver.unarchiveTopLevelObjectWithData替换为unarchivedObject
How to replace NSKeyedUnarchiver.unarchiveTopLevelObjectWithData with unarchivedObject when data is a Dictionary
问:
iOS 16.4 弃用了 unarchiveTopLevelObjectWithData(_:),应替换为 unarchivedObject(
ofClass:from:)。
当您存档 Swift 词典时,例如 ,如何使用较新的 API 来取消存档它?[String: Any]
NSKeyedUnarchiver.unarchivedObject(ofClass: [String: Any].self, from: data)
导致生成时错误:
静态方法“unarchivedObject(ofClass:from:)”要求“[String : Any]”符合“NSCoding”
//create the data from dictionary
let dictionary: [String: Any] = ["Text": "Hello", "Number": 1, "Array": ["Hello", "World"]]
let data = try! NSKeyedArchiver.archivedData(withRootObject: dictionary, requiringSecureCoding: true)
//and later get the dictionary from the data
let dictionary = try? NSKeyedUnarchiver.unarchivedObject(ofClass: [String: Any].self, from: data) //sorry no can do
答:
由于 Swift 字典的类型不符合 ,因此您需要回退到使用 .由于您还使用安全编码,因此还需要列出字典中可以包含的所有类型。[String: Any]
NSCoding
NSDictionary
您将需要使用该方法,以便可以列出所有类。unarchivedObject(ofClasses:from:)
let dictionary = try? NSKeyedUnarchiver.unarchivedObject(ofClasses: [NSDictionary.self, NSArray.self], from: data) as? NSDictionary
您最终可能还需要将 和 添加到类列表中。继续添加错误消息中显示的类,直到它正常工作。NSString.self
NSNumber.self
评论
PropertyListSerialization
您可以使用以下虚拟对象:而不是 .
这样,您就可以涵盖所有 NS 案例。
它对我有用,尽管出现了紫色消息(Apple 始终处于安全状态。不错,但是......[NSObject.self]
[NSDictionary.self, NSArray.self ...... ]
-[NSKeyedUnarchiver validateAllowedClass:forKey:]:NSSecureCoding 允许的类列表包含 [NSObject 类],该类通过允许隐式解码任何 Objective-C 类来绕过安全性。请考虑在解码过程中通过仅列出要解码的类或比 NSObject 更具体的基类来缩小解码期间允许的类的范围。这将在将来成为一个错误。允许的类列表:{( “'NSObject' (0x219ef2d98) [/usr/lib]” )}
评论
NSDictionary
[String: Any]
NSKeyed[Un]Archiver
Any
Error Domain=NSCocoaErrorDomain Code=4864 "value for key 'NS.objects' was of unexpected class 'NSArray' (0x20a9295a0) [/System/Library/Frameworks/CoreFoundation.framework].
NSDictionary<NSObject, NSObject>