我正在尝试快速创建一个通用结果枚举,这是我到目前为止所拥有的:
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'
我做错什么了吗?
答案 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)
?您将其大写并在定义中使用命名变量,但使用小写字母,并且不要在使用变量的地方使用命名变量。 :-(