Set<CustomObject> 的安全编码

Secure coding of Set<CustomObject>

我的应用程序使用核心数据,它存储自定义 class CustomClass.
的实例 这个 class 有很多属性,大部分是标准类型,但是一个 属性 是 xxx: Set<CustomObject>.
因此 xcdatamodeld 指定(在其他标准类型中)类型 Transformable 的属性 xxxxxx 就是 Set<CustomObject>。 它的类型是 Optional 而 Transformer 现在是 NSSecureUnarchiveFromData.
之前未指定 Transformer,因此解码不安全。但是 Apple 现在建议使用安全编码,因为将来不推荐使用不安全的编码。

为了启用安全编码,我执行了以下操作:
CustomClass 现在采用 NSSecureCoding 而不是 NSCoding
以下 var 已添加到 CustomClass

public static var supportsSecureCoding: Bool { get { return true } }  

然后我尝试修改 public required convenience init?(coder aDecoder: NSCoder) {…} 以便属性 xxx 被安全解码。我知道而不是

let xxx = aDecoder.decodeObject(forKey: „xxx“) as? Set<CustomObject>  

我现在必须使用decodeObject(of:forKey:),其中of是要解码的对象的类型,这里输入Set<CustomObject>.
我的问题是我不知道如何表述:如果我使用

let xxx = aDecoder.decodeObject(of: Set<CustomObject>.self, forKey: „xxx“)  

我收到错误 Cannot convert value of type 'Set<CustomObject>.Type' to expected argument type '[AnyClass]?' (aka 'Optional<Array<AnyObject.Type>>‘)
显然编译器没有编译

func decodeObject<DecodedObjectType>(of cls: DecodedObjectType.Type, forKey key: String) -> DecodedObjectType? where DecodedObjectType : NSObject, DecodedObjectType : NSCoding  

而是

func decodeObject(of classes: [AnyClass]?, forKey key: String) -> Any?

即它不将 Set<CustomObject> 视为一种类型,而是一种类型的集合。

那么,如何指定只解码一个类型,即Set<CustomObject>

不幸的是,我在 Apple 文档中找不到任何内容,但我在 this post 中找到了解决方案的提示:
NSSecureCoding 不可用 所有标准 swift 类。对于那些不支持它的 类,必须使用 Objective-C 对应的 类,即 NSString 而不是 String

一个例子:如果 var string = "String" 必须被安全编码,就必须使用例如aCoder.encode(string as NSString, forKey: „string“)

目前 Set 不受 NSSecureCoding 支持。我不得不这样使用

let aSet: Set<CustomObject> = []
aCoder.encode(aSet as NSSet, forKey: „aSet“)  

let decodedSet = aDecoder.decodeObject(of: NSSet.self, forKey: „aSet“) as? Set<CustomObject>