如何为结果枚举编写扩展名

时间:2019-07-11 07:10:22

标签: swift

我使用通用类型为Result<T: Resource, Error>的Result Enum表示了我的API请求的结果

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

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

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

            case .failure:
                return null
        }
    }
}

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

  

必须在具有“ where”子句指定约束的非专业通用类型“ Result”上声明受约束的扩展名

     

使用未声明的类型'T'

3 个答案:

答案 0 :(得分:1)

您只需按如下所示创建扩展名,

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

        case .failure:
            return nil
        }
    }
}

enum定义一样,T始终为Resource,因此您无需在扩展名中指定。

但是,如果Resource是某个protocol,并且您想在声明中对value变量施加约束,则可以在扩展名中使用where子句指定该变量,如下所示,

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

        case .failure:
            return nil
        }
    }
}

答案 1 :(得分:1)

编写类型约束如下:

enum Result<T, Error> {
    case success(T)
    case failure(Error)
}

struct Resource {
    let value: String
}

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

        case .failure:
            return nil
        }
    }
}

答案 2 :(得分:1)

您可以像这样做

enum Result<T> where T: Resource {
    case success(T)
    case failure(Error?)
}

使用enum Result创建case success的{​​{1}},接受类型为Resource通用关联值,并使用case failure作为其另一个Error? 关联值

由于您使用的是Resource类型的通用参数,因此我假设Resource是具有protocol作为其属性之一的value

protocol Resource {
    var value: String {get set}
}

现在,extension Result就像

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

        case let .failure(error):
            return error
        }
    }
}

现在return error中的case failureresource.value中的case success

您无需在T中的where子句中指定通用参数 extension,因为您在定义{{1 }}。

用法:

enum Result