Невозможно исправить ошибку с помощью перечисления Generic Result в RxSwift - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь создать общее перечисление результатов в 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, вот так: (TheT указывается в вызове функции, это сокращено для краткости)

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 is Errorвведите

Я что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Кроме того факта, что ваша заглавная буква повсюду ... Когда вы делаете Result.failure(anError), компилятор не может определить тип T. Для исправления просто выполните: Result<T>.failure(anError)

... Или это должно быть Result<T>.Failure(error: anError)?Вы используете заглавную букву и используете в определении именованную переменную, но вы используете строчные буквы и не используете именованную переменную там, где она используется.: - (

0 голосов
/ 05 октября 2018

Как насчет этого?

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

Я также удалил наследство, потому что оно не имеет смысла, когда вы на самом деле переносите его в регистр перечисления.

Возможно, вы захотите поставитьсетевой код где-то внутри Observable.create замыкания, потому что ответ недоступен в последовательном порядке.Закрытие вместо этого избегает последовательного потока, как сетевой запрос / ответ.

...