1

我正在尝试快速创建一个通用的结果枚举,这就是我到目前为止所拥有的:

enum Result<T: Codable>: Error {
    //Indicates that it was a success, and data is the returned result
    case Success(data: T)

    //Indicates that there was an unrecognizable error
    case Failure(error: Error)

    //Some cases for specific status codes
    case Forbidden              //Status code: 403
    case NotAcceptable          //Status code: 406
    case Conflict               //Status code: 409
    case InternalServerError    //Status code: 500
}

然后我尝试从中创建一个 Observable ,如下所示:(T 在函数调用中指定,为简洁起见缩短)

Observable<Result<T>>.create { observer in 
    //Some code to go make an Http requests and return response....
    switch response.result {
        case .success(let value):
            //This works fine
            observer.onNext(Result.success(value))
            observer.onCompleted()
        case .failure(let error):
            //This is where things go wrong.
            observer.onError(Result.failure(error))
    }
}

问题是当我尝试在.failure案例中返回时,它总是说Argument type 'Result<_>' does not conform to expected type 'Error'即使 Result 是错误类型

难道我做错了什么?

4

2 回答 2

1

那这个呢?

enum Result<T: Codable, E: Error> {
    case Success(data: T)
    case Failure(error: E)
    // ...
}

我还删除了继承,因为当您实际上用枚举案例包装它时它没有意义。

您可能还希望将网络代码放在Observable.create闭包内的某个位置,因为响应无法以顺序方式获得。相反,闭包会像网络请求/响应一样逃避顺序流。

于 2018-10-05T07:43:58.143 回答
1

除了你的大写无处不在......当你这样做时Result.failure(anError),编译器无法推断 T 的类型。要修复只是:Result<T>.failure(anError)

...或者应该是Result<T>.Failure(error: anError)?您将其大写并在定义中使用命名变量,但您使用小写并且不要在使用它的地方使用命名变量。:-(

于 2018-10-05T12:56:09.063 回答