什么是Swift相当于C#/ .NET / LINQ的Enumerable.All方法?

时间:2016-01-28 12:11:31

标签: swift functional-programming

我想要一个将给定函数应用于序列的函数,如果给定函数对序列的每个元素都返回true,则返回true,如来自C#/ .NET / LINQ世界的Enumerable.All

3 个答案:

答案 0 :(得分:2)

Jon's answer上建立:您可以使用contains() 而不是(显式)循环:

extension SequenceType {
    func all(@noescape predicate: (Self.Generator.Element) throws -> Bool)
        rethrows -> Bool {
            return !(try contains { !(try predicate($0)) })
    }
}

答案 1 :(得分:1)

没有内置函数可以执行此操作,但您可以轻松添加自己的函数作为协议扩展方法:

extension SequenceType {
    func all(@noescape predicate: (Self.Generator.Element) throws -> Bool)
        rethrows -> Bool {

        for i in self {
            if !(try predicate(i)) { return false }
        }
        return true
    }
}

然后在类似的序列上使用它:

let allPositive = [1, 2, 3].all { $0 > 0 }

答案 2 :(得分:0)

不确定这是否有帮助,但您可以使用reduce获得相同的结果。这是一个快速的游乐场,我把它放在一起来证明这个概念:

let nums = [2, 2, 3, 4]

// Will only evaluate to true if all numbers are even.
let allEven = nums.reduce(true) {
    if !$0 || $1 % 2 != 0 {
        return false
    }
    return true
}