gpt4 book ai didi

Swift playground 显示错误的语句执行次数(forEach on array)

转载 作者:搜寻专家 更新时间:2023-10-31 22:21:47 26 4
gpt4 key购买 nike

我一直在探索仿函数,但在理解 forEach 仿函数在幕后的作用时遇到了一些困难。例如,当我将其输入 Playground 时:

let array = [1] // [1]
array.forEach { $0.value } // (3 times)
array.forEach { _ in print("hello") } // (2 times)

当我展开 (3 times)(2 times) 时,它只显示 ()

其中一个,为什么对 1 个元素的数组执行多次,为什么两次 forEach 计算的执行次数不同?

最佳答案

这是一个相当困惑的情况。

让我们首先考虑第二个forEach:

array.forEach { _ in print("hello") } // (2 times)

该行的不同部分在不同的时间执行,Swift 将这些时间中的每一个都计为一次单独的执行。第一次是在调用 array.forEach 时,第二次是在调用 forEach 时执行对 print 的调用匿名函数的主体。如果我们放入换行符,我们可以看到 Swift 每行只执行一次并报告它的“值”:

array.forEach { _ in  // [1]
print("hello") // ()
}

我们也可以尝试将匿名函数放在一个变量中:

let p: (Int) -> () = { _ in print("hello") } // (2 times)
array.forEach(p) // [1]

上面,Swift 执行了 let p 行的一部分来创建匿名函数并将其存储在 p 中,稍后该行的另一部分调用 在函数体内打印

Swift 报告 print 行的值为 () 因为 forEach 的参数必须是返回 ( )(空元组,又名 Void)。由于 print 已经返回 (),Swift 只是让它成为该行的值。

在我们回过头来考虑您的第一个 forEach 示例之前,让我们考虑另一个示例:

print("hello"); print("goodbye") // (2 times)

Swift 说这一行执行了两次,因为该行中的每个单独的语句都算作一次单独的执行。

现在让我们考虑您的第一个示例:

array.forEach { $0.value } // (3 times)

让我们尝试换行:

array.forEach {  // [1]
$0.value // (2 times)
}

好的,所以 forEach 调用本身算作一次执行,正如预期的那样。但是 Swift 声称它正在执行两次匿名函数的主体。为什么?

回想一下,forEach 的参数必须是一个返回 () 的函数。但是$0.value的类型不是();它是内部类型 Builtin.Int64。所以 Swift 在行尾插入另一个语句,返回 ()。实际上,Swift 就像你写的那样:

array.forEach {    // [1]
$0.value; () // (2 times)
}

我们可以通过显式向函数添加另一行来证明这一点:

array.forEach {  // [1]
$0.value // <<<opaque type>>>
()
}

现在 Swift 认为每一行都按预期执行一次。

关于Swift playground 显示错误的语句执行次数(forEach on array),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33422729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com