Set<CustomObject> 的安全编码
Secure coding of Set<CustomObject>
我的应用程序使用核心数据,它存储自定义 class CustomClass
.
的实例
这个 class 有很多属性,大部分是标准类型,但是一个 属性 是 xxx: Set<CustomObject>
.
因此 xcdatamodeld
指定(在其他标准类型中)类型 Transformable
的属性 xxx
。 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>
?
不幸的是,我在 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>
我的应用程序使用核心数据,它存储自定义 class CustomClass
.
的实例
这个 class 有很多属性,大部分是标准类型,但是一个 属性 是 xxx: Set<CustomObject>
.
因此 xcdatamodeld
指定(在其他标准类型中)类型 Transformable
的属性 xxx
。 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>
?
不幸的是,我在 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>