Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 什么是C#/.NET/LINQ';s可枚举。所有方法?_Swift_Functional Programming - Fatal编程技术网

Swift 什么是C#/.NET/LINQ';s可枚举。所有方法?

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

我想要一个将给定函数应用于序列并返回true的函数,如果给定函数对序列的每个元素都返回true,就像从C#/.NET/LINQ世界中返回的一样。

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

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
}