Ошибка издателя с помощью Combine Framework - PullRequest
0 голосов
/ 02 марта 2020

У меня есть такая установка с ошибкой, показанной ниже

enum DataError: Error {
    case failed(error: Error)
}

enum UIError: Error {
    case failed(error: Error)
}

struct SomeData {

}

func foo() -> AnyPublisher<Result<[SomeData]?, DataError>, Never> {
    ...
}

func foo2() -> AnyPublisher<Result<[SomeData]?, UIError>, Never> {
    return foo()
            .mapError { error -> UIError 
                switch error {
                    ....
                }

                return UIError.failed(error: $0)
            }
            .eraseToAnyPublisher() ===> // Error Cannot convert return expression of type 'AnyPublisher<Result<[SomeData]?, DataError>, UIError>' to return type 'AnyPublisher<Result<[T], UIError>, Never>'
}

Сообщение об ошибке кажется довольно простым, но не может его устранить.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Возможно, вам потребуется что-то вроде этого:

Издатель не возвращает ошибку. Результат содержит ошибку, поэтому необходимо отобразить ошибку.

Я немного изменил перечисления ошибок, чтобы их было легче понять.

    enum DataError: Error {
        case failed
    }

    enum UIError: Error {
        case failed
    }

    func foo2() -> AnyPublisher<Result<[SomeData]?, UIError>, Never> {
        return foo().map { result in
            result.mapError { _ -> UIError in
                UIError.failed
            }
        }.eraseToAnyPublisher()
    }
0 голосов
/ 02 марта 2020

Нет смысла использовать Result в Combine, поскольку ваши Publisher s всегда будут либо выдавать значение, либо завершаться с ошибкой. Они никогда не должны выдавать значение, которое содержит ошибку.

Как только вы избавитесь от использования Result, ошибки go исчезнут.

func foo() -> AnyPublisher<[SomeData], DataError> {
    ...
}

func foo2() -> AnyPublisher<[SomeData], UIError> {
    return foo()
        .mapError { error -> UIError in
            switch error {
            ...
            }

            return UIError.failed(error: error)
        }
        .eraseToAnyPublisher()
}

Либо с помощью Result или в Publisher, вам обычно не нужно использовать Optional s, так как в случае ошибки просто не будет значения, нет необходимости возвращать значение nil, в отличие от завершения обработчики.

...