如果我给一个函数参数一个非常量的默认值(例如函数调用的结果)是那个刚刚计算一次的值(如果是的话,什么时候?)或者每次函数是这样评估的叫?
答案 0 :(得分:8)
具有等号(=)的参数和其类型后的表达式被理解为具有给定表达式的默认值。调用函数时会计算给定的表达式。如果在调用函数时省略了该参数,则使用默认值。
您可以通过将以下内容放在游乐场中来自行演示:
import Foundation
func foo(i: UInt32 = arc4random()) {
print(i)
}
foo()
foo()
foo()
foo()
foo()
将打印五个不同的随机数(除非随机数生成器通过一些天文学上不可能的重合生成相同数字五次)。
在上面引用的文档中没有明确说明,因此值得注意的是,当您执行在调用函数时指定参数时,不会计算默认表达式。你也可以在游乐场演示:
func getSomeInt() -> Int {
print("getSomeInt() was called")
return 42
}
func bar(_ i: Int = getSomeInt()) {
print(i)
}
bar(1)
当它运行时,你会看到" getSomeInt()被调用"没有打印。