疑问:为何自定义类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
相关产品推荐
相关产品推荐

