var vs let in Swift

时间:2014-09-22 15:24:49

标签: swift

我是Swift编程的新手,我已经遇到了varlet类型。我知道let是常数,我知道这意味着什么,但我从来没有使用常数,主要是因为我不需要。那么为什么我应该使用var代替let,我应该在什么情况下使用它?

3 个答案:

答案 0 :(得分:20)

而不是常量变量,swift中的正确术语是 immutable mutable

当您知道一旦为变量赋值后,使用let,它就不会改变 - 即它是不可变的。如果你声明一个表视图单元格的id,很可能它在它的生命周期内不会改变,所以通过声明它是不可变的,没有你可以错误地改变它的风险 - 编译器会通知你这一点。

典型用例:

  • 常量(计时器的超时,固定大小标签的宽度,登录尝试的最大次数等)。在这种情况下,常量是代码上的字面值的替代(想到#define
  • 用作另一个函数的输入的函数的返回值
  • 表达式的中间结果,用作另一个表达式的输入
  • 可选绑定中未展开值的容器
  • REST API调用返回的数据,从JSON反序列化为结构,必须存储在数据库中

还有更多。每次我写var时,我都会问自己:这个变量可以改变吗?。如果答案为否,我将var替换为let。有时我也使用一种更具保护性的方法:我将所有内容声明为不可变的,然后编译器会在我尝试修改其中一个时告诉我,并且对于每种情况我都可以相应地进行。

一些注意事项

对于引用类型(类),immutable意味着一旦将实例分配给不可变变量,就不能将另一个实例分配给同一个变量。

对于值类型(数字,字符串,数组,字典,结构,枚举),immutable意味着一旦分配了值,就无法更改值本身。对于简单数据类型(IntFloatString),这意味着您无法分配相同类型的其他值。对于复合数据类型(结构,数组,字典),这意味着您无法分配新值(例如结构的新实例),您无法更改任何存储的属性。

对于开发人员和阅读代码的人来说,不可变变量也具有语义含义 - 它清楚地表明变量不会发生变化。

最后,但从纯粹的开发角度来看可能不那么重要,编译器可以对不可变的内容进行优化。

答案 1 :(得分:5)

一般来说,可变状态是尽可能避免的。

不可变值有助于推理代码,因为您可以轻松跟踪它们并清楚地识别从开始到结束的值。

另一方面,可变变量很难跟踪您的数据流,因为任何人都可以随时修改它们。特别是在处理并发应用程序时,对可变状态的推理很快就会成为一项难以置信的艰巨任务。

因此,作为设计原则,尽可能尝试使用let,如果需要修改对象,只需生成一个新实例。

每当你需要使用var时,也许是因为使用它会使代码更清晰,尽可能地限制它们的范围而不是暴露任何可变状态。例如,如果在函数内部声明var,只要您不向调用者公开该可变性,即从调用者的角度来看,它是安全的,在实现中是否使用varval无关紧要。

答案 2 :(得分:0)

通常,如果您知道变量的值不会改变,请将其声明为常量。不可变变量将使您的代码更具可读性,因为您确定特定变量永远不会被更改。这对编译器来说也可能更好,因为它可以利用变量是常量并执行一些优化这一事实。

这不仅适用于Swift。即使在C中,当初始化后变量的值没有改变时,最好确保它是const

所以,你认为“我不需要”的方式应该改变。对于TIMEOUT等值,您不需要常量。只要您知道在初始化后不需要更改变量的值,就应该有一个常量变量。

注意:这更像是一般的“编程整体”答案,而不是特定于Swift。 @ Antonio的回答更多地关注Swift。