通过注入仅符合 Encodable 协议的 class 创建 Encodable class

Creating Encodable class by injecting class conforming only to Encodable protocol

我正在构建使用 Body class 的网络模块,它将被编码为 url 请求的主体。我想用任何符合 Encodable 协议的 class 初始化 Body,在我的例子中它是 MyDevice class 符合 DeviceEncodable,这是协议定义我的 url 请求所需的一切。 MyDevice class 已经继承自另一个名为 SpecialClass 的 class,因此我只能使其符合协议,因为 swift 不允许继承多个class。问题是,当我用 DeviceEncodable 初始化 Body 时,我得到错误“类型 'Body' 不符合协议 'Encodable'” 我明白这是因为 DeviceEncodable 可以是 class 但也可以是其他符合它的协议。在 Body 函数中将 DeviceEncodable 用作 属性 的正确解决方案是什么,这样它就可以正确编码并且不需要继承?这是 Samble 代码:

    class Body: Encodable {
    let device: DeviceEncodable
    init(_ deviceInfo: DeviceEncodable) {
        self.device = deviceInfo
    }
}

protocol DeviceEncodable: AnyObject, Encodable  {
    var someSpecialProperty: String {get}
}

class MyDevice: SpecialClass, DeviceEncodable {
    var someSpecialProperty: String = "special"
}

class SpecialClass {
    var someOtherProperty: String = "other"
}

您不能对 device 进行编码,因为 device 必须是符合 Encodable 的具体类型。可能的解决方案是约束为 Encodable 或通用协议的关联类型,例如

class Body<T : Encodable> : Encodable {
    let device: T

    init(_ deviceInfo: T) {
        self.device = deviceInfo
    }
}