【问题标题】:Decodable conformance with other protocols in SwiftSwift 中与其他协议的可解码一致性
【发布时间】:2020-08-05 09:09:23
【问题描述】:

问题是结构符合协议(我们称之为 PA)和可解码,但 PA 强加了一个不可解码类型的属性。示例:

protocol PA {
    var b: [PB]? { get }
}

protocol PB {}

struct SA: PA, Decodable {
    let b: [PB]? // SA's conformance to Decodable wants this to be [Decodable], but PA's conformance imposes [PB]
}

struct SB: PB, Decodable {}

上面的代码拒绝编译,带有:

  • 错误:“SA”类型不符合“Decodable”协议
  • 注意:无法自动合成“Decodable”,因为“[PB]?”不符合“可解码”

将该行更改为:

let b: [PB & Decodable]?

也不起作用并给出:

  • 错误:类型“SA”不符合协议“PA”
  • 注意:候选有非匹配类型“[Decodable & PB]?”
  • 错误:“SA”类型不符合“Decodable”协议
  • 注意:无法自动合成“Decodable”,因为“[Decodable & PB]?”不符合“可解码”
  • 注意:协议需要类型为“[PB]?”的属性“b”;要添加存根吗?

请注意,第 4 行是无意义的:“'[Decodable & PB]?'不符合‘可解码’”。等什么?

有什么建议吗?

【问题讨论】:

  • 显而易见的解决方案是让 PB 符合 Decodable ,你为什么不能这样做?如果 PB 不能符合 Decodable 那么你想解码什么?

标签: swift protocols codable decodable


【解决方案1】:

您可以创建一个混合协议:

protocol PADecodable {
    var b: [PB & Decodable]? { get }
}

struct SA: PADecodable {
    let b: [PB & Decodable]?
}

【讨论】:

    【解决方案2】:

    您可以通过以下方式修复它:

    protocol PA {
        var b: [PB]? { get }
    }
    
    protocol PB {}
    
    struct SA<T: PB & Codable>: PA, Codable {
        private var _b: [T]?
        
        var b: [PB]? {
            return _b
        }
    }
    

    【讨论】:

    • 没错,它会工作。不过,我希望避免使用私有财产。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    相关资源
    最近更新 更多