Swift5中如何正确重写子类的NSSecureCoding supportsSecureCoding?
解决Swift子类重写NSSecureCoding的supportsSecureCoding问题
核心问题
父类中使用存储类型属性定义supportsSecureCoding,导致子类无法用存储属性重写——Swift不允许子类用存储属性覆盖父类的存储类型属性,必须改用计算类型属性实现才能满足协议要求。
修正后的代码
import Foundation class Result : NSObject, NSSecureCoding { // 父类改用计算类型属性实现协议要求 static var supportsSecureCoding: Bool { return true } var name: String = "-" override init() { super.init() } required init(coder decoder: NSCoder) { super.init() // 改用NSSecureCoding规范的安全解码方法 name = decoder.decodeObject(of: NSString.self, forKey: "name") as! String } func encode(with coder: NSCoder) { coder.encode(name, forKey: "name") } class ResultDE: Result { // 子类用计算类型属性重写 override static var supportsSecureCoding: Bool { return true } required init(coder decoder: NSCoder) { super.init() name = decoder.decodeObject(of: NSString.self, forKey: "name") as! String } override func encode(with coder: NSCoder) { coder.encode(name, forKey: "name") } } }
关键说明
- 协议语义匹配:NSSecureCoding中的
supportsSecureCoding在Objective-C中是类方法,对应Swift的计算类型属性才是最贴合的实现方式,而非存储属性。 - 重写规则兼容:存储类型属性无法被子类重写,计算类型属性通过
override关键字可以正确覆盖父类实现,同时满足运行时对安全编码的校验要求。 - 安全规范强化:解码时使用
decodeObject(of:forKey:)替代旧的decodeObject(forKey:),这是NSSecureCoding强制要求的安全解码方式,能避免潜在的类型注入风险。
内容的提问来源于stack exchange,提问作者Stephane Gasparini
相关产品推荐
相关产品推荐

