Swift 什么是C#/.NET/LINQ';s可枚举。所有方法?
我想要一个将给定函数应用于序列并返回true的函数,如果给定函数对序列的每个元素都返回true,就像从C#/.NET/LINQ世界中返回的一样。没有内置函数来执行此操作,但您可以轻松地添加自己的作为协议扩展方法:Swift 什么是C#/.NET/LINQ';s可枚举。所有方法?,swift,functional-programming,Swift,Functional Programming,我想要一个将给定函数应用于序列并返回true的函数,如果给定函数对序列的每个元素都返回true,就像从C#/.NET/LINQ世界中返回的一样。没有内置函数来执行此操作,但您可以轻松地添加自己的作为协议扩展方法: extension SequenceType { func all(@noescape predicate: (Self.Generator.Element) throws -> Bool) rethrows -> Bool { f
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 }
基于:您可以使用contains()
而不是(显式)循环:
不确定这是否有帮助,但您可以使用
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
}
啊,谢谢。我没有意识到contains()的谓词版本类似于.NET的Enumerable.Any()。知道这一点也很有用:)我只是觉得我应该说我决定接受我的答案,而不是这个答案,因为我觉得它更具可读性。我认为这张照片中的双重否定让人很难快速理解。再次感谢您的回答:)一个可能的缺点是
reduce()
总是遍历整个序列,而contains()
在找到匹配的元素后立即返回。这可能相关,也可能无关注意,您可以将代码简化为nums.reduce(true){$0&&($1%2==0)}
.Nice-我知道有人会想出一个更简洁的版本。
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
}