Set <CustomObject>

时间:2019-09-29 15:49:47

标签: swift core-data transformable nssecurecoding

我的应用使用核心数据,该数据存储了自定义类CustomClass的实例。
此类具有许多属性,其中大多数是标准类型,但是一个属性是xxx: Set<CustomObject>
xcdatamodeld因此(除其他标准类型外)指定了xxx类型的属性TransformablexxxSet<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>

1 个答案:

答案 0 :(得分:0)

不幸的是,我在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>