打破filter()函数

时间:2015-06-28 15:20:31

标签: ios swift filter functional-programming

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

使用循环这很容易,但我想将优化应用于函数式编程主体。 (编译器本身无法执行这样的优化,因为它不知道我的数组和我的意图。)

可以这样做吗?

3 个答案:

答案 0 :(得分:12)

first(where:)在找到第一个传递案例时会突然爆发:

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

let b2 = data.first(where:{$0=="Beta"})

答案 1 :(得分:5)

filter不是为了突破而写的。我不相信有一种开箱即用的方式可以做你正在寻找的东西。

一般来说,最好避免使功能更灵活,以涵盖狭窄的案例。添加早期保释有时可能会有用,但会以使filter复杂化为代价,而且代码可能难以阅读(请记住使用filter等函数的主要目标之一,{ {1}}等是为了使代码更容易阅读并确保代码是正确的。有些函数确实支持提前退出,但这对于它们的目的至关重要 - 例如mapcontains

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

takeWhile

答案 2 :(得分:1)

使用过滤器的目的是分解谓词并扫描整个集合。在通过整个数据集之前,您无法找出要过滤的数据。在其基本形式中,过滤器只是检查构造新集合的条件(谓词):

let bools = [true, false, false, true]

print(bools.filter {$0})

你所要求的是获得对过滤器中迭代器循环的控制,同时实现过滤器以通过隐藏它来简化过滤器。我建议你使用语言中构建的控制流语句(if,for,etc,continue,break)来提供你需要的东西。没有必要强迫奇怪的语法语句使你的代码看起来更复杂和不可思议。