【问题标题】:Creating Encodable class by injecting class conforming only to Encodable protocol通过注入仅符合 Encodable 协议的类来创建 Encodable 类
【发布时间】:2022-01-11 20:49:40
【问题描述】:

我正在构建使用 Body 类的网络模块,该类将被编码为 url 请求的主体。我想用任何符合 Encodable 协议的类来初始化 Body,在我的情况下,它是符合 DeviceEncodableMyDevice 类,这是定义我的 url 请求所需的一切的协议。 MyDevice 类已经继承自另一个名为 SpecialClass 的类,因此我只能将其符合协议,因为 swift 不允许从多个类继承。问题是,当我用DeviceEncodable 初始化Body 时,我得到错误“类型'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"
}

【问题讨论】:

    标签: swift encode encodable


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。泛型几乎可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多