为什么Swift中的过滤器会迭代集合两次?

myt*_*thz 14 swift

Swift操场或控制台应用程序中的以下代码:

let letters = ["A", "B", "C"]

letters.filter({
    (x : String) -> Bool in
    println("PRINT: \(x)")
    return true
})
Run Code Online (Sandbox Code Playgroud)

打印出来:

PRINT: A
PRINT: B
PRINT: C
PRINT: A
PRINT: B
PRINT: C
Run Code Online (Sandbox Code Playgroud)

为什么它会两次迭代集合?

Ana*_*ile 12

最有可能filter实现的是首先计算它需要存储的元素数量,然后在使用该数字来调整新数组的存储分配大小后,再次循环以复制他需要保留的元素.

如果总是返回它只循环一次的事实false意味着如果结果为空则它会优化第二个循环.

您可能希望将此视为一个错误,但它可能"按设计工作":毕竟数组不是列表.

  • 他们可以.他们没有.这是一个实现选择.根据其他实施细节,它可能是也可能不是最佳选择. (2认同)

one*_*cat 7

它在beta 5中进行了修改.它现在只运行一次,ABC而不是打印ABCABC