Swift使用Encodable协议类型作为属性时Body不遵循Encodable的解决方案
解决方案
有两种实现方式可选,可根据业务场景灵活选择:
方案1:使用泛型约束(无需手动实现编码逻辑,代码量最少)
利用泛型绑定具体的遵守DeviceEncodable协议的类型,编译器可以自动完成Encodable实现推导:
class Body<T: DeviceEncodable>: Encodable { let device: T init(_ deviceInfo: T) { self.device = deviceInfo } } // 使用示例 let myDevice = MyDevice() let body = Body(myDevice)
适用场景:同一个Body实例不需要兼容多种不同的DeviceEncodable实现类的场景。
方案2:手动实现Encodable编码逻辑(保留动态协议类型的灵活性)
手动实现Body的encode方法,直接调用属性的编码能力即可:
class Body: Encodable { let device: DeviceEncodable init(_ deviceInfo: DeviceEncodable) { self.device = deviceInfo } // 手动实现编码逻辑 enum CodingKeys: String, CodingKey { case device } func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(device, forKey: .device) } }
适用场景:需要在运行时动态传入不同DeviceEncodable实现类的场景,无需修改Body定义即可兼容所有协议实现类。
两种方案都不需要修改原有DeviceEncodable协议、MyDevice类和SpecialClass的继承关系,符合需求。
内容的提问来源于stack exchange,提问作者Mr.SwiftOak
相关产品推荐
相关产品推荐

