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, которые рекомендуют добавлять функции-члены вместо бесплатных.