0

我正在构建网络模块,该模块使用Body将被编码为 url 请求正文的类。我想Body使用符合 Encodable 协议的任何类进行初始化,在我的情况下,它是MyDevice符合的类DeviceEncodable,它是定义我的 url 请求所需的一切的协议。MyDevice该类已经从另一个名为 的类继承,SpecialClass因此我只能使其符合协议,因为 swift 不允许从多个类继承。问题是当我初始化BodyDeviceEncodable我得到错误“类型'Body'不符合协议'Encodable'”我明白这是因为DeviceEncodable可以是类但也可以是其他一些符合它的协议。DeviceEncodable 作为财产使用的正确解决方案是什么Body函数,因此它将被正确编码而无需继承?这是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"
}
4

1 回答 1

1

您不能编码device,因为device必须是符合Encodable. 可能的解决方案是协议的关联类型Encodable或泛型,例如

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

    init(_ deviceInfo: T) {
        self.device = deviceInfo
    }
}
于 2021-12-06T17:28:25.420 回答