什么时候评估Swift函数的默认参数值?

Jon*_*son 1 swift

如果我给一个函数参数一个非常量的默认值(例如函数调用的结果)是那个只评估一次的值(如果是的话,什么时候?)或者每次调用函数时它是否被评估?

Jon*_*son 8

来自Swift编程语言,在语言参考>声明>特殊参数类型下:

具有等号(=)的参数和其类型后的表达式被理解为具有给定表达式的默认值.调用函数时会计算给定的表达式.如果在调用函数时省略该参数,则使用默认值.

您可以通过将以下内容放在游乐场中来自行演示:

import Foundation

func foo(i: UInt32 = arc4random()) {
    print(i)
}

foo()
foo()
foo()
foo()
foo()
Run Code Online (Sandbox Code Playgroud)

这将打印五个不同的随机数(除非随机数发生器通过一些天文学上不可能的重合产生相同的数字五次).

这不是在上面引述的文件明确,所以这是值得注意的,当你调用默认表情不计算函数时指定参数.你也可以在游乐场演示:

func getSomeInt() -> Int {
    print("getSomeInt() was called")
    return 42
}

func bar(_ i: Int = getSomeInt()) {
    print(i)
}

bar(1)
Run Code Online (Sandbox Code Playgroud)

当它运行时你会看到"getSomeInt()被调用"没有打印.