与Swift中其他协议的可解码一致性



问题是当一个结构符合协议(我们称之为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"不符合协议"可解码">
  • 注意:无法自动合成"可解码",因为"[PB]?"不符合"可解码">

将该行更改为:

let b: [PB & Decodable]?

也不起作用,并给出:

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

注意第4行是无意义的:"[可解码&PB]?'不符合"可解码";。等等什么?

有什么建议吗?

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

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

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

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

var b: [PB]? {
return _b
}
}

相关内容

  • 没有找到相关文章

最新更新