gpt4 book ai didi

swift - 为什么我可以创建一个与函数参数同名的变量?

转载 作者:行者123 更新时间:2023-11-28 10:26:55 26 4
gpt4 key购买 nike

在一个函数中,如果我被传递给一个 int(它是不可变类型,即 let n),如果我将它传递给一个函数,我怎么能创建一个 var 变量呢?只是想知道为什么 swift 以这种方式工作,以及这样做的原因。

func checkNum(_ n: Int) -> Bool {
var n = n

}

在这里,让我来做这件事。

最佳答案

这被称为“阴影”,并且在很多地方都被允许使用,因为它对程序员来说很方便,因为它避免了在范围内有两个名称相似的变量。如果没有此功能,此代码将是:

func checkNum(_ n: Int) -> Bool {
var writableN = n
...
}

这增加了修改 writableN 的可能性,然后在函数中无意中再次使用 n 。由于额外的变量,它还会使函数更难理解。 (当然,如果不小心使用,隐藏也会使代码更难以理解。)

这与if let 遮蔽非常相似,例如:

var x: Int? = ...
if let x = x { ... }

这允许您在 if let 中使用 x 作为非 Optional,而不必为它想出其他名称。

这是一个相当普遍的特征。每当有新的作用域时,变量就会影子。例如,您可以在函数内声明与属性或全局变量同名的变量。您也可以在函数内创建作用域

func checkNum(_ n: Int) -> Bool {
var n = n // Shadows previous `let`

do {
let n = 4 // Shadows previous `var`
print(n)
}

return true
}

小心使用,这很有帮助。过于频繁地使用(就像最后一个示例一样),它会使代码非常困惑。

您的具体案例涉及 Swift 的另一个重要方面,即它试图控制共享的可变状态。函数接收的 n 是传递的整数的副本。修改 n 永远不会直接修改调用者的变量。 (有 inout 允许这样做,但它很微妙。它不共享状态。它将值复制进来,并在返回时将值复制回来。)

由于 n 不与调用者共享,Swift 通过使其不可变来使其非常明确。如果你想修改它,你需要明确地制作另一个副本,而 var n = n 就是这样做的。

关于swift - 为什么我可以创建一个与函数参数同名的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58805322/

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