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

疑问:为何自定义类LCLAdvantagePlusJackpotCache不遵守Codable协议?

问题分析与解决

你的类之所以看起来不遵守Codable协议,大概率是访问级别不匹配导致的——你的类被标记为public,但内部定义的CodingKeys枚举却是默认的internal访问级别,这会让编译器无法自动合成符合public级别的Codable协议方法(init(from:)和encode(to:))。

Swift的Codable自动合成规则里,合成方法的访问级别会和CodingKeys枚举保持一致。如果类是public的,协议要求的方法也必须是public的,但默认internal级别的CodingKeys只能合成internal的协议方法,这就导致编译器判定你没有满足Codable的协议要求。

修复方案

只需要把CodingKeys枚举也标记为public即可:

public class LCLAdvantagePlusJackpotCache: Codable {
    public let token: String
    public let amount: NSNumber
    public let member: Bool
    
    public init(token: String, amount: NSNumber, member: Bool) {
        self.token = token
        self.amount = amount
        self.member = member
    }
    
    // 将CodingKeys改为public访问级别
    public enum CodingKeys: String, CodingKey {
        case token, amount, member
    }
}

额外检查点

如果修改后仍有问题,可以再确认以下几点:

  • 你的Swift版本是否支持NSNumber的Codable自动合成(Swift 4及以上版本均支持)
  • 确保NSNumber没有被自定义代码覆盖或修改了Codable相关实现
  • 检查是否存在其他隐性编译错误,导致编译器误报Codable协议不遵守

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:18:05