You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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")
        }
    }
}

关键说明

  1. 协议语义匹配:NSSecureCoding中的supportsSecureCoding在Objective-C中是类方法,对应Swift的计算类型属性才是最贴合的实现方式,而非存储属性。
  2. 重写规则兼容:存储类型属性无法被子类重写,计算类型属性通过override关键字可以正确覆盖父类实现,同时满足运行时对安全编码的校验要求。
  3. 安全规范强化:解码时使用decodeObject(of:forKey:)替代旧的decodeObject(forKey:),这是NSSecureCoding强制要求的安全解码方式,能避免潜在的类型注入风险。

内容的提问来源于stack exchange,提问作者Stephane Gasparini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:53:26