我不明白为什么下面的代码的结果是如何获得的。请解释一下该过程的每一步。
您可以通过将 b 作为参数传递给 myFunc 来进行更多实验,但输出仍然相同。
let a = myFunc()
var b = 19
func myFunc() -> Int {
b
}
func changeBAndGetA() -> Int {
b = 16
return a
}
print(changeBAndGetA(), a, b)
// outputs 0 0 16
我预计它是 16 16 16。因为我读到全局变量是延迟计算的
当 Swift 代码执行时,a 和 b 最初都被视为保留默认整数值 0。出现这种行为的原因是变量是在作用域内声明的,但在它们被调用时尚未显式赋值。首次访问。
您看到的行为类似于以下场景:
print(c) /prints 0
var c = 5
在此示例中,即使 c 在显式设置为 5 之前被打印,编译器也会将其视为在使用时初始化为 0。这不会导致错误,因为文件中定义了“c”。
当第一行运行时,它将 a 设置为 b,即 0。当 print 语句运行时,它调用changeBAndGetA(),将 b 更改为 16,返回 a,即 0。然后打印 a,即 0,然后打印 b,即 0。