【问题标题】:var vs let in Swift [duplicate]Swift中的var vs let [重复]
【发布时间】:2014-11-16 15:14:57
【问题描述】:

我是 Swift 编程新手,我遇到过 varlet 类型。我知道let 是一个常量,我知道这意味着什么,但我从未使用过常量,主要是因为我不需要。那我为什么要用var而不是let,什么情况下应该用呢?

【问题讨论】:

  • 您应该尽可能使用 let,因为编译器能够更好地优化。
  • 常量是为了便于阅读和帮助编译器优化(出于相同的原因:更容易推断一个永远不会改变其值的变量。它使可能的代码分支更小) .但是,我不会因为编译器优化而到处使用常量。过早的优化等...每当变量永远不需要更改其值时,我都会使用它来提高您自己的可读性。有时,你可以稍微重写你的代码,只需要给一个变量赋值一次,这样你就可以让它成为一个 let (但如果它不那么可读的话就不行!)
  • @AlexK。这个问题更多的是关于设计原则。您链接的更多是关于语义的。

标签: swift


【解决方案1】:

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

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

因此,您对“我不需要”的看法应该改变。你不需要一个常量,比如TIMEOUT 等值。你应该有一个常量变量,只要你知道变量的值在初始化后不需要更改。

注意:这更像是一个通用的“整体编程”答案,而不是特定于 Swift。 @Antonio 的回答更侧重于 Swift。

【讨论】:

    【解决方案2】:

    而不是constantvariable,swift中正确的术语是immutablemutable

    当您知道一旦将值分配给变量后,它就不会改变 - 即它是不可变的,您可以使用 let。如果您声明表格视图单元格的 id,它很可能在其生命周期内不会更改,因此通过将其声明为不可变,您不会错误地更改它 - 编译器会通知您。

    典型用例:

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

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

    一些注意事项

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

    对于值类型(数字、字符串、数组、字典、结构体、枚举)而言,不可变意味着一旦分配了值,就无法更改值本身。对于简单数据类型(IntFloatString),这意味着您不能分配相同类型的另一个值。对于复合数据类型(结构、数组、字典),这意味着您不能分配新值(例如结构的新实例)并且您不能更改它们的任何存储属性。

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

    最后,但从纯开发的角度来看可能不太重要,不可变对象可以由编译器进行优化。

    【讨论】:

      【解决方案3】:

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

      不可变值有助于推理代码,因为您可以轻松追踪它们并从头到尾清楚地识别值。

      另一方面,可变变量难以跟踪您的数据流,因为任何人都可以随时修改它们。尤其是在处理并发应用程序时,关于可变状态的推理很快就会成为一项非常困难的任务。

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

      当您需要使用var 时,可能是因为使用它可以使代码更清晰,请尽量限制它们的范围,不要暴露任何可变状态。例如,如果您在函数中声明 var,只要您不向调用者公开该可变性,这样做是安全的,即从调用者的角度来看,您是否使用varval 在实现中。

      【讨论】:

      • 我赞成这个答案,因为我认为它比其他两个要好得多(OP 显然理解语义,并且您谈到了可读性)。但是,我认为它不应该在任何地方使用。如果尝试编写尽可能多的不可变代码,则可能会使函数变得冗长、丑陋和麻烦。有时 vars 使代码更简洁。应根据具体情况使用它们。
      • @MillieSmith,我明白你的意思。在我看来,可变性应该是一个例外。尽管如此,只要不暴露可变状态,代码中的一点 var 就不会杀死任何人。我会更新我的答案。
      猜你喜欢
      • 2018-06-08
      • 2016-04-05
      • 1970-01-01
      • 2017-08-18
      • 2019-12-30
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多