首页 > 解决方案 > 如何为结果枚举编写扩展

问题描述

我已经使用具有泛型类型的 Result Enum 来表示我的 API 请求的结果,如下所示Result<T: Resource, Error>

在某些情况下,我不想讨论请求是成功还是失败,但我仍然需要返回的资源作为可空值。

我尝试将扩展编写为以下代码:

extension Result<T, Error> where T: Resource {
    var value: Any? {
        switch self {
            case .success(let resource):
                return resource.value
     
            case .failure:
                return null
        }
    }
}

但是我得到了这些编译器错误:

约束扩展必须在非特化泛型类型“Result”上声明,约束由“where”子句指定

使用未声明的类型“T”

标签: swift

解决方案


您可以简单地创建如下扩展,

extension Result {
    var value: Any? {
        switch self {
        case .success(let resource):
            return resource

        case .failure:
            return nil
        }
    }
}

正如在enum定义中一样,T总是Resource这样您就不需要在扩展名中指定。

但是如果Resource是一些protocol并且您想value在声明中对变量施加约束,那么您可以在扩展 usingwhere子句中指定它,如下所示,

extension Result where T == someSubTypeOfResource {
    var value: Any? {
        switch self {
        case .success(let resource):
            return resource

        case .failure:
            return nil
        }
    }
}

推荐阅读