Swift 为什么将一个未命名函数作为转换传递给数组会在最远的抽象中增加一个迭代计数

Swift 为什么将一个未命名函数作为转换传递给数组会在最远的抽象中增加一个迭代计数,swift,Swift,我正在熟悉将未命名函数作为参数传递的过程,并且根据中的示例,我正在使用它进行实践 因此我们有一个Ints的数组: var numbers: Int[] = [1, 2, 3, 4, 5, 6, 7] 我应用这样的变换:(7) 这等于:(7) 这等于:(8) 这等于:(8) 这等于:(8) 如下图所示,Playerd侧栏中的迭代计数显示,在函数声明的最远抽象中,它有8个计数 问题: 为什么在最后两个示例中显示为8次迭代 它没有显示8次迭代,真的。它显示了在那条线上执行了8件事情。作为map函数

我正在熟悉将未命名函数作为参数传递的过程,并且根据中的示例,我正在使用它进行实践

因此我们有一个
Int
s的数组:

var numbers: Int[] = [1, 2, 3, 4, 5, 6, 7]
我应用这样的变换:(7)

这等于:(7)

这等于:(8)

这等于:(8)

这等于:(8)

如下图所示,Playerd侧栏中的迭代计数显示,在函数声明的最远抽象中,它有8个计数

问题:
为什么在最后两个示例中显示为8次迭代

它没有显示8次迭代,真的。它显示了在那条线上执行了8件事情。作为
map
函数的一部分,有7次执行,第8次执行将赋值返回到
numbers
变量


看起来这可能会提供更有用的诊断。我强烈建议您通过提供反馈。

稍微重写您的实验,只使用闭包,调用计数仍然相差一个:

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

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


如果REPL报告的(
x
次)计数确实表示访问该代码位置的次数,并且注意到在未明确指定闭包类型参数的情况下(例如,
f2
),该计数大于1,我猜至少在REPL中,额外的访问是建立实际的参数类型,并填补基础AST中的空白

虽然看起来额外的计数是为了分配回
数字
,但事实并非如此。删除分配仍然会导致八次调用。其他可能性见下面我的答案。
func transformNumber(number: Int) -> Int {
    let result = number * 3
    return result
}

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