为什么将未命名的函数作为变换传递给数组会在最远的抽象中在操场中向迭代计数添加一个

时间:2014-06-03 03:40:14

标签: swift

我正在努力将未命名的函数作为参数传递,我正在使用它来实践,基于the Swift Programming Guide.中的示例

所以我们有一个Int s数组:

var numbers: Int[] = [1, 2, 3, 4, 5, 6, 7]

我应用这样的变换:(7)

func transformNumber(number: Int) -> Int {
    let result = number * 3
    return result
}

numbers = numbers.map(transformNumber)

等于:(7)

numbers = numbers.map({(number: Int) -> Int in
    let result = number * 3
    return result;
    })

等于:(8)

numbers = numbers.map({number in number * 3})

等于:(8)

numbers = numbers.map({$0 * 3})

等于:(8)

numbers = numbers.map() {$0 * 3}

正如您在下图中所看到的,操场侧边栏中的迭代计数显示,在函数声明的最远抽象中,它具有8个计数。

enter image description here

问题

为什么它显示最后两个示例的8次迭代?

2 个答案:

答案 0 :(得分:4)

实际上并没有显示8次迭代。它显示在该行上执行了8件事。作为map函数的一部分执行了7次执行,而将numbers变量重新分配到第8次执行。

看起来这可能提供更有用的诊断。我强烈建议您通过https://bugreport.apple.com提供反馈。

答案 1 :(得分:1)

略微重写您的实验以仅使用闭包,通话计数仍然相差一个:

案例1:明确指定参数类型(访问次数为7)

var f1 = {(number: Int) -> Int  in
  let result = number * 3
  return result
}
numbers.map(f1)

案例2:隐式参数类型(访问次数为8)

var f2 = {$0 * 3}
numbers.map(f2)

如果REPL报告的(x次)计数确实代表了对该代码位置的访问次数,并且在未明确指定闭包类型参数的情况下注意计数大于1 (例如f2),我的猜测是,至少在游乐场REPL中,额外的访问是建立实际的参数类型并填补底层AST的差距。