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