swift - 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”不符合协议“可解码”
- 注意:不能自动合成 'Decodable' 因为 '[PB]?' 不符合“可解码”
将该行更改为:
let b: [PB & Decodable]?
也不起作用并给出:
- 错误:类型“SA”不符合协议“PA”
- 注意:候选人的类型不匹配“[Decodable & PB]?”
- 错误:类型“SA”不符合协议“可解码”
- 注意:无法自动合成“Decodable”,因为“[Decodable & PB]?” 不符合“可解码”
- 注意:协议需要类型为“[PB]?”的属性“b”;你想添加一个存根吗?
请注意,第 4 行是无意义的:“'[Decodable & PB]?' 不符合‘可解码’”。等什么?
有什么建议吗?
解决方案
您可以创建一个混合协议:
protocol PADecodable {
var b: [PB & Decodable]? { get }
}
struct SA: PADecodable {
let b: [PB & Decodable]?
}
推荐阅读
- windows - 在 XAMPP 中使用 PHP 版本切换器时将 Xdebug 设置为 PHP8
- php - 一旦用户登录输入错误的凭据 PHP PDO 就无法显示警报
- python - 为什么我不能使用 groupby?问题出在哪里?
- python - 如何遍历 CSV 文件 URL 调用 PYTHON
- java - 为什么我必须写两次才能在 Arraylist 中添加输入?
- caching - 如何减少对服务器端认证授权平台的访问
- python-3.x - 我如何获得成员在 discord.py 中输入的命令
- regex - 如何在飞镖中用骆驼案来判案
- nebular - 如何在 ng2-smart-table 中动态添加自定义图标/css
- postgresql - 使用 postgres 超级用户创建 Postgres FDW,但对远程模式具有只读访问权限