我想要一个将给定函数应用于序列的函数,如果给定函数对序列的每个元素都返回true,则返回true,如来自C#/ .NET / LINQ世界的Enumerable.All。
答案 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
}