问题是当一个结构符合协议(我们称之为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
}
}