Swift是否具有像Any或All这样的短程高阶函数?

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中有没有这样的东西?

Mar*_*n R 5

Sequence(并且特别是CollectionArray)具有(短路)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中allSatisfySequence类型已经添加了一个方法(目前处于测试阶段),请参阅

(需要最近的4.2开发人员快照.)