Swift中Result的Failure类型无法用协议:‘any ShadowError’不遵循Error
如何让Result的Failure类型设为遵循Error的自定义协议?
我们知道直接用Swift内置的Error协议作为Result的Failure类型是可行的:
let x: Result<Void, Error> = .success(())
但如果定义一个遵循Error的自定义协议ShadowError,直接用它作为Failure类型会报错:
protocol ShadowError: Error {} let x: Result<Void, ShadowError> = .success(()) // 报错:Type 'any ShadowError' cannot conform to Error
编译器给出的错误提示:
Type 'any ShadowError' cannot conform to Error
可行的解决办法
使用
any关键字明确标注存在类型(Swift 5.7+)
Swift 5.7及以后版本引入了any关键字来明确表示存在类型(即协议作为具体类型使用)。因为ShadowError本身遵循Error,所以any ShadowError也符合Error协议要求,修改代码如下即可正常编译:protocol ShadowError: Error {} let x: Result<Void, any ShadowError> = .success(())泛型上下文下的扩展适配
如果需要在泛型场景中更方便地使用这个自定义协议作为Failure类型,可以给Result添加扩展,封装相关构造逻辑:protocol ShadowError: Error {} extension Result where Failure == any ShadowError { static func successWithoutValue() -> Result<Void, any ShadowError> { .success(()) } } let x: Result<Void, any ShadowError> = .successWithoutValue()
补充说明
如果自定义协议ShadowError包含Self约束或关联类型,仅用any无法解决问题,此时需要通过类型擦除来包装协议实现——比如创建一个AnyShadowError结构体持有具体的ShadowError实现,使其满足Error协议的要求。
内容的提问来源于stack exchange,提问作者Oliver Pearmain
相关产品推荐
相关产品推荐

