You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 11:20:12