我正在努力将未命名的函数作为参数传递,我正在使用它来实践,基于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个计数。
为什么它显示最后两个示例的8次迭代?
答案 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的差距。