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