何时计算Swift函数默认参数值?
如果我给一个函数参数一个非常量的默认值(例如函数调用的结果),那么该值只计算一次(如果是,何时计算?),还是每次调用函数时都进行计算?: 带有等号(=)的参数及其类型后的表达式被理解为具有给定表达式的默认值。调用函数时,将对给定表达式求值。如果调用函数时忽略了该参数,则使用默认值 您可以在操场上展示以下内容:何时计算Swift函数默认参数值?,swift,Swift,如果我给一个函数参数一个非常量的默认值(例如函数调用的结果),那么该值只计算一次(如果是,何时计算?),还是每次调用函数时都进行计算?: 带有等号(=)的参数及其类型后的表达式被理解为具有给定表达式的默认值。调用函数时,将对给定表达式求值。如果调用函数时忽略了该参数,则使用默认值 您可以在操场上展示以下内容: import Foundation func foo(i: UInt32 = arc4random()) { print(i) } foo() foo() foo() foo(
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)
运行时,您将看到“getsomint()was called”不会被打印。+1 for
,除非随机数生成器通过某种天文学上不可能的巧合将同一数字生成五次。
:DYou可能会补充,只有在未提供参数的情况下,才会计算默认值表达式,即foo(1)
不会调用arc4random
@MartinR这是一个很好的观点。我在答案中增加了一些细节。谢谢