使用 decodeObject(of: forKey:) 解码符合协议的对象

Using decodeObject(of: forKey:) to decode an object that conforms to a protocol

我有一个 Objective-C 协议要求符合 NSSecureCoding:

@protocol MyProtocol <NSObject, NSSecureCoding>
…
@end

我有一个父对象存储对符合 MyProtocol 的对象的引用,我希望父对象也符合 NSSecureCoding。当我尝试这个时:

required init?(coder aDecoder: NSCoder) {

    if let childObject = aDecoder.decodeObject(of: MyProtocol.self, forKey: "childObject") {
        self. childObject = childObject
    } else {
        return nil
    }
}

我收到错误:'decodeObject(of:forKey:)' is unavailable in Swift: use generic 'decodeObjectOfClass(_:forKey:)'

如果您不知道所编码对象的具体 class,有什么方法可以使用 NSSecureCoding?

NSSecureCoding 的全部意义在于防止这种用例。如果您不知道正在解码的 class,那么攻击者可以诱使您解码为一个 class,它的行为与您对给定方法的预期不同(称为 "substitution attack" ).这是一种用于攻击系统的技术,NSSecureCoding 是为了阻止它而开发的。

即使不是这种情况,也不可能构造协议类型的对象。运行时无法知道为实例变量分配多少内存。

为了符合 NSSecureCoding,您必须知道所有子对象的精确 classes。