iOS RxSwift, как проверить, если Result == .success?

Меня интересуют только результаты с .success типа, которые приходят из моего запроса.

Как я могу установить фильтр, чтобы пропускать только результаты.success из Result<Value> перечисление?

public enum Result<Value> {
    case success(Value)
    case failure(Error)
}


query.filter{ (result: Result<Double>) in
                switch result {
                case .success:
                    return true
                case .failure:
                    return false
                }
            }

Я хочу сделать краткую проверку только на успех, но компилятор не позволяет этого.

.filter{result in
    return result == .success
}

1 ответ

Решение

Вот одна строка, не такая короткая, как вы описали, но короче, чем переключатель:

if case .success = result { return true } else { return false }

Перечисления со связанными значениями нуждаются в сопоставлении с образцом, поэтому вам нужно if/switch/for/while чтобы это произошло.

Кроме того, если вы используете этот вид фильтрации в нескольких местах, вы можете расширить Result:

extension Result {
    var isSuccess: Bool { if case .success = result { return true } else { return false } }

    var isError: Bool {  return !isSuccess  }
}

и используйте это расширение:

query.filter { $0.isSuccess }

Или функциональный подход, где isSuccess isError являются глобальными функциями:

func isSuccess<T>(_ result: Result<T>) -> Bool {
    if case .success = result { return true } else { return false }
}

func isError<T>(_ result: Result<T>) -> Bool {
    return !isSuccess(result)
}

// later in the code
query.filter(isSuccess)

Последний подход имеет небольшой выигрыш в производительности, так как компилятору не нужно каждый раз создавать другое закрытие, и он будет использовать тот, который хранится под isSuccess название. Хотя он не полностью соответствует соглашениям Swift, которые рекомендуют добавлять функции-члены вместо бесплатных.

Другие вопросы по тегам