无法在RxSwift中将通用结果枚举错误

时间:2018-10-05 07:01:49

标签: swift swift4 alamofire rx-swift swift4.2

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

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情况时,即使Result是错误类型,它总是显示Argument type 'Result<_>' does not conform to expected type 'Error'

我做错什么了吗?

2 个答案:

答案 0 :(得分:1)

那呢?

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

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

您可能还想将网络代码放在Observable.create闭包内的某处,因为该响应不能按顺序进行。相反,闭包就像网络请求/响应一样,转义了顺序流。

答案 1 :(得分:1)

除了您的大写字母无处不在的事实之外,当您执行Perceptron(alpha=0.0001, class_weight=None, eta0=1.0, fit_intercept=True, max_iter=10, n_iter=None, n_jobs=1, penalty=None, random_state=42, shuffle=True, tol=None, verbose=0, warm_start=False) 时,编译器无法推断T的类型。要解决此问题,只需执行:Result.failure(anError)

...还是Result<T>.failure(anError)?您将其大写并在定义中使用命名变量,但使用小写字母,并且不要在使用变量的地方使用命名变量。 :-(