Swift的游乐场或控制台应用程序中的以下代码:
let letters = ["A", "B", "C"]
letters.filter({
(x : String) -> Bool in
println("PRINT: \(x)")
return true
})
打印出来:
PRINT: A
PRINT: B
PRINT: C
PRINT: A
PRINT: B
PRINT: C
为什么要对集合进行两次迭代?
答案 0 :(得分:12)
最有可能实现filter
以首先计算它需要存储的元素数量,然后在使用该数字来确定新数组的存储分配大小后,再次循环以复制他需要的元素保持。
如果总是返回false
,它只循环一次,这意味着如果结果为空,它会优化掉第二个循环。
您可能希望将此视为一个错误,但它可能是"按照设计工作&#34 ;:毕竟数组不是列表。
答案 1 :(得分:7)
它在测试版5中进行了修改。它现在只运行一次,打印ABC
而不是ABCABC
答案 2 :(得分:1)
filter
返回一个正在操场上打印出来的数组。
/// Return a Array containing the elements `x` of `self` for which
/// `includeElement(x)` is `true`
func filter(includeElement: (T) -> Bool) -> T[]
我认为(6 times)
不正确,因为如果你看下面true
只会返回3次。
编辑:以上不正确。
从更多地讲述它,我只能说这只是filter
函数的行为。
letters.reverse().filter({
(x : String) -> Bool in
println("PRINT: \(x)")
return true
})
这会打印CBACBA
,因此它只是按顺序遍历数组两次。
letters.filter({
(x : String) -> Bool in
println("PRINT: \(x)")
if (x == "A") {
return true
}
return false
})
这仍然打印ABCABC
,所以去图..
我会稍微问一下斯威夫特的工程师,然后再回答你的原因! (如果他们知道:p)