我想优化依赖filter()的函数。在某些情况下,我想在达到某些元素时突破它们。 (例如,我可能有一个不同元素的数组。或者,我只想实现一种findFirst功能。)在这种情况下,函数在数组结束之前一直持续效率低下。
使用循环这很容易,但我想将优化应用于函数式编程主体。 (编译器本身无法执行这样的优化,因为它不知道我的数组和我的意图。)
可以这样做吗?
答案 0 :(得分:12)
first(where:)
在找到第一个传递案例时会突然爆发:
let data = ["Alpha","Beta","Gamma","Delta"]
let b2 = data.first(where:{$0=="Beta"})
答案 1 :(得分:5)
filter
不是为了突破而写的。我不相信有一种开箱即用的方式可以做你正在寻找的东西。
一般来说,最好避免使功能更灵活,以涵盖狭窄的案例。添加早期保释有时可能会有用,但会以使filter
复杂化为代价,而且代码可能难以阅读(请记住使用filter
等函数的主要目标之一,{ {1}}等是为了使代码更容易阅读并确保代码是正确的。有些函数确实支持提前退出,但这对于它们的目的至关重要 - 例如map
或contains
。
但是创建自己的高阶函数来做你想做的事并不难,其名称使他们的意图非常明确。例如,要将序列中的所有元素都放到与模式不匹配的第一个元素中,您可以像这样编写indexOf
:
takeWhile
答案 2 :(得分:1)
使用过滤器的目的是分解谓词并扫描整个集合。在通过整个数据集之前,您无法找出要过滤的数据。在其基本形式中,过滤器只是检查构造新集合的条件(谓词):
let bools = [true, false, false, true]
print(bools.filter {$0})
你所要求的是获得对过滤器中迭代器循环的控制,同时实现过滤器以通过隐藏它来简化过滤器。我建议你使用语言中构建的控制流语句(if,for,etc,continue,break)来提供你需要的东西。没有必要强迫奇怪的语法语句使你的代码看起来更复杂和不可思议。