打破filter()函数

Dan*_*iel 6 functional-programming filter ios swift

我想优化依赖filter()的函数.在某些情况下,我想在达到某些元素时突破它们.(例如,我可能有一个不同元素的数组.或者,我只想实现一种findFirst功能.)在这种情况下,函数继续直到数组结束似乎效率低下.

这对于循环非常简单,但我想将优化应用于函数式编程主体.(编译器本身无法执行这样的优化,因为它不知道我的数组和我的意图.)

可以这样做吗?

Dav*_*idA 14

first(where:)打破了,当它找到的第一个传球的情况下:

let data = ["Alpha","Beta","Gamma","Delta"]

let b2 = data.first(where:{$0=="Beta"})
Run Code Online (Sandbox Code Playgroud)

  • 别再看这是正确的答案 (2认同)

Air*_*ity 5

filter不是那样写的.我不相信有一种开箱即用的方式来做你正在寻找的那种东西.

一般来说,最好避免使功能更灵活,以涵盖狭窄的情况.添加早期保释可能有时是有用的,但会来在复杂的成本filter,并且代码很可能会难以阅读(记住的使用功能,如的主要目标之一filter,map等等是为了使代码更易于阅读和确保代码是正确的).有些功能确实支持提前退出,当它是其目的的基础时 - 例如,containsindexOf.

但是创建你自己的高阶函数来做你想要的并不是很难,其名称使他们的意图非常明确.例如,要将序列中的所有元素都放到与模式不匹配的第一个元素中,您可以这样写takeWhile:

extension SequenceType {
    func takeWhile(condition: Generator.Element -> Bool) -> [Generator.Element] {
        var result: [Generator.Element] = []
        for x in self {
            guard condition(x) else { break }
            result.append(x)
        }
        return result
    }
}



let nums = [1,3,1,2]
let isOdd = { $0%2 == 1 }
let initialOdd = nums.takeWhile(isOdd)
print(initialOdd)
Run Code Online (Sandbox Code Playgroud)