Mar*_*eIV 8 short-circuiting higher-order-functions swift
我知道Swift的高阶函数,如Map,Filter,Reduce和FlatMap,但是我不知道有什么像'All'或'Any'那样返回一个布尔值,在枚举时对正测试进行短路.结果.
例如,isFulfilled假设您拥有10,000个对象的集合,每个对象都有一个被调用的属性,并且您希望查看该集合中是否有任何对象isFulfilled设置为false.在C#中,您可以使用myObjects.Any(obj -> !obj.isFulfilled)并且当该条件被命中时,它会使枚举的其余部分短路并立即返回true.
Swift中有没有这样的东西?
Sequence(并且特别是Collection和Array)具有(短路)contains(where:)方法以一个布尔谓词作为参数.例如,
if array.contains(where: { $0 % 2 == 0 })
Run Code Online (Sandbox Code Playgroud)
检查数组是否包含任何偶数.
没有"全部"方法,但您也可以contains()通过否定谓词和结果来使用它.例如,
if !array.contains(where: { $0 % 2 != 0 })
Run Code Online (Sandbox Code Playgroud)
检查 数组中的所有数字是否均匀.当然,您可以定义自定义扩展方法:
extension Sequence {
func allSatisfy(_ predicate: (Iterator.Element) -> Bool) -> Bool {
return !contains(where: { !predicate($0) } )
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想以与方法相同的方式允许"抛出"谓词,
contains那么它将被定义为
extension Sequence {
func allSatisfy(_ predicate: (Iterator.Element) throws -> Bool) rethrows -> Bool {
return try !contains(where: { try !predicate($0) } )
}
}
Run Code Online (Sandbox Code Playgroud)
更新:正如James Shapiro正确注意到的那样,Swift 4.2中allSatisfy的Sequence类型已经添加了一个方法(目前处于测试阶段),请参阅
(需要最近的4.2开发人员快照.)
| 归档时间: |
|
| 查看次数: |
434 次 |
| 最近记录: |