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

如何为Facebook AuthenticationToken重写init(coder: NSCoder)并创建实例

如何创建Facebook AuthenticationToken的Mock实例?

你尝试为Facebook的AuthenticationToken创建Mock子类,仅开放init(coder: NSCoder)初始化方法,但自定义init?(_ stringToken: String)时调用super.init(coder: NSCoder())出错——核心问题是NSCoder是抽象类,无法直接实例化。以下是两种可行的解决方式:

方式一:通过归档生成合法NSCoder实例

利用NSKeyedArchiver和NSKeyedUnarchiver生成可用于父类初始化的NSCoder实例,代码示例:

class AuthenticationTokenMock: AuthenticationToken {
    var stubString: String?
    
    init?(_ stringToken: String) {
        stubString = stringToken
        // 生成合法的NSCoder实例
        do {
            let data = try NSKeyedArchiver.archivedData(withRootObject: [:], requiringSecureCoding: false)
            let coder = try NSKeyedUnarchiver(forReadingFrom: data)
            super.init(coder: coder)
        } catch {
            return nil
        }
    }
    
    required init(coder: NSCoder) {
        super.init(coder: coder)
    }
}

实际测试中可按需调整归档的根对象,同时注意错误处理,避免强制解包。

方式二:运行时直接分配实例(仅测试场景)

如果仅用于单元测试,可通过Objective-C运行时绕过初始化流程直接创建对象,代码示例:

class AuthenticationTokenMock: AuthenticationToken {
    var stubString: String?
    
    static func mock(with token: String) -> AuthenticationTokenMock {
        let mock = objc_alloc(AuthenticationTokenMock.self)
            .assumingMemoryBound(to: AuthenticationTokenMock.self)
            .pointee
        mock.stubString = token
        return mock
    }
    
    required init(coder: NSCoder) {
        super.init(coder: coder)
    }
}

这种方式跳过了正常初始化逻辑,仅适合测试环境下的Mock场景,生产环境禁止使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 20:11:27