我正在寻找创建一个非常接近的函数filter,除了它保持不匹配的结果,并维护排序顺序.例如,假设您想过滤掉数组中可被3整除的数字,并且仍然保留不能被3整除的数字列表.
filter使用filter,您只能得到可被3整除的数字列表,原始列表保持不变.然后,您可以使用相反的谓词再次过滤原始列表,但这是不必要的第二遍.代码如下所示:
let numbers = [1,2,3,4,5,6,7,8,9,10]
let divisibleBy3 = numbers.filter { $0 % 3 == 0 } // [3,6,9]
let theRest = numbers.filter { $0 % 3 != 0 }      // [1,2,4,5,7,8,10]
确实,这是非常可读的,但是对于我而言,它执行2遍的事实似乎效率低下,特别是如果谓词更复杂的话.这是实际需要的两倍多的检查.
separate在Collection扩展中使用自定义功能我的下一次尝试是扩展Collection并制作一个我打电话的功能separate.此函数将获取集合并一次一个地浏览元素,并将它们添加到匹配列表或不匹配列表中.代码如下所示:
extension Collection {
    func separate(predicate: (Generator.Element) -> Bool) -> (matching: [Generator.Element], notMatching: [Generator.Element]) {
        var groups: ([Generator.Element],[Generator.Element]) = ([],[])
        for element in self {
            if predicate(element) {
                groups.0.append(element) …