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

时间:2014-06-03 21:56:21

标签: swift

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

为什么要对集合进行两次迭代?

3 个答案:

答案 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)

相关问题