iOS RxSwift, как проверить, если Result == .success? - PullRequest
0 голосов
/ 02 сентября 2018

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

Как настроить фильтр на пропуск только результатов .success из Result<Value> enum?

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 Ответ

0 голосов
/ 02 сентября 2018

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

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

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

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

extension Result {
    var isSuccess: Bool { if case .success = self { 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, которые рекомендуют добавлять функции-члены вместо бесплатных.

...