我只对来自我的查询的.success
类型的结果感兴趣。
如何设置过滤器只能通过Result<Value>
枚举的.success结果?
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
}
这是一个单行,不像你描述的那么短,但比开关短:
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约定。