无法在 RxSwift 中使用通用结果枚举出错

Cannot put error with Generic Result enum in RxSwift

我正在尝试在 swift 中创建一个通用结果枚举,这是我目前所拥有的:

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 情况下尝试 return 时,它总是说 Argument type 'Result<_>' does not conform to expected type 'Error' 即使结果是错误类型

我是不是做错了什么?

这个呢?

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

我还删除了继承,因为当您实际用枚举大小写包装它时它没有任何意义。

您可能还想将网络代码放在 Observable.create 闭包内的某处,因为响应无法按顺序提供。相反,闭包像网络 request/response 那样转义顺序流。

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

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