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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:36:03