Swift:结果的失败类型不能是协议 - “Type 'any ShadowError' cannot conform to Error”

Swift: Result's Failure Type cannot be protocol - "Type 'any ShadowError' cannot conform to Error"

提问人:Oliver Pearmain 提问时间:5/16/2023 最后编辑:Solomon UckoOliver Pearmain 更新时间:5/16/2023 访问量:72

问:

Error是一个协议,一个人能够做到这一点......

let x: Result<Void, Error> = .success(())

ShadowError符合并且也是一种协议,但一个人无法做到这一点......Error

protocol ShadowError: Error {}
let x: Result<Void, ShadowError> = .success(()) // FAILS Type 'any ShadowError' cannot conform to Error

因为编译器抱怨这个错误

类型“any ShadowError”不能符合“错误”

结果失败类型是(或其他)吗?ShadowErrorprotocol

Swift 错误处理 多态性 协议 resulttype

评论


答:

2赞 Rob Napier 5/16/2023 #1

这不可能作为协议。您可以将 ShadowError 设置为枚举或结构体(甚至是包装另一个 Error 的结构体),但它不能是协议。协议存在(协议的“任何”实例)不符合协议,因此不是错误。这有一个神奇的例外:确实符合 .但你不能重现它。它只是.any ShadowErrorany ErrorErrorError

有关此内容的文档,请参阅 SE-0235 将结果添加到标准库

作为此提案准备工作的一部分,为错误(并且仅错误)添加了自一致性。这对于在通用上下文中处理错误通常也很有用。

这种自一致性不会扩展到包括 Error 协议在内的协议组合,而只扩展到确切的 Error 类型。将来可以添加这样的组合,但这超出了 Swift 5 的范围。

评论

0赞 Oliver Pearmain 5/16/2023
是错误魔术让我问了这个问题。在这种情况下,协议如何获得通过?仅供参考。Error