Ale*_*one 0 enums reactive-programming ios swift rx-swift
我只对.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
}
}
Run Code Online (Sandbox Code Playgroud)
我只想对成功进行速记检查,但是编译器不允许这样做。
.filter{result in
return result == .success
}
Run Code Online (Sandbox Code Playgroud)
这是一个单线,不像您描述的那么短,但是比开关短:
if case .success = result { return true } else { return false }
Run Code Online (Sandbox Code Playgroud)
关联值枚举需要模式匹配,因此你需要一个if/ switch/ for/ while要做到这一点。
另外,如果您在多个地方使用这种过滤,则可以扩展Result:
extension Result {
var isSuccess: Bool { if case .success = self { return true } else { return false } }
var isError: Bool { return !isSuccess }
}
Run Code Online (Sandbox Code Playgroud)
,并使用以下扩展名:
query.filter { $0.isSuccess }
Run Code Online (Sandbox Code Playgroud)
或功能性方法,其中有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)
Run Code Online (Sandbox Code Playgroud)
后一种方法具有很小的性能优势,因为编译器不需要每次都创建另一个闭包,而将使用以该isSuccess名称存储的闭包。尽管它并不完全符合建议添加成员函数而不是自由函数的Swift约定。
| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |