2014-09-22 44 views
4

我是Swift编程新手,我遇到过varlet类型。我知道let是一个常数,我知道这意味着什么,但是我从来没有使用常量,主要是因为我不需要。那么为什么我应该使用var而不是let,我应该在什么情况下使用它?var vs让我进入Swift

+0

您应该尽可能使用let,因为编译器能够更好地进行优化。 – 2014-09-22 15:26:33

+0

常量是为了便于阅读和帮助编译器优化(两者出于同样的原因:更容易推断一个永远不会改变其值的变量,这使得可能的代码分支变得更小)。但是,由于编译器优化,我不会在任何地方使用常量。过早优化等等等等......只要变量永远不需要改变它的值,我就会将它用于自己的可读性。有时候,你可以稍微改写一下你的代码,你只需要将它分配给一个变量,这样你就可以让它变成一个let(但是如果它不那么可读!) – 2014-09-22 15:28:33

+0

@AlexK。这个问题更多的是关于设计原则。你链接的更多的是语义。 – 2014-09-22 15:33:32

回答

19

不是恒定可变,在迅速正确的术语是不可改变可变

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

典型使用情形:

  • 甲常数(一个计时器超时,或固定大小的标签,登录尝试的最大数量等的宽度)。在这种情况下的常数是用于散布在代码字面值的替换(想到#define
  • 用作输入用于另一功能
  • 表达式的中间结果的函数的返回值,被用作对于另一种表达
  • 在可选的结合
  • 通过REST API呼叫,从JSON反序列化为一个结构返回的数据,其必须被存储在数据库中

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

一些考虑

对于引用类型(类),一旦你指定一个实例的不可改变的变量,可以另一种情况下不分配给同一个变量不可变的装置。

对于值类型(数字,字符串,数组,字典,结构,枚举),不可变意味着一旦赋值,就不能更改值本身。对于简单的数据类型(Int,FloatString),这意味着您不能指定相同类型的其他值。对于复合数据类型(结构体,数组,字典),它意味着您不能分配新值(例如结构的新实例)您无法更改其存储的任何属性。

此外,不变变量对开发人员和阅读代码的人有语义含义 - 它清楚地表明该变量不会改变。

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

0

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

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

因此,您考虑“我不需要”的方式应该改变。你不需要一个常数,只有像TIMEOUT这样的值。你应该有一个常量变量,你知道变量的值在初始化后不需要改变。

注意:这更多的是一般性的“整体编程”的答案,并不特定于Swift。 @安东尼奥的回答更多关注Swift。

5

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

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

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

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

无论何时您需要使用var,可能是因为使用它会使代码更加清晰,请尝试尽可能限制其范围,而不要暴露任何可变状态。举个例子,如果你在一个函数内部声明了一个var,那么只要你不向调用者公开这个可变性,也就是说,从调用者的角度来看,这样做是安全的,不管你使用的是var还是在执行中为val

+0

我会upvote这个答案,因为我认为它远胜于另外两个(OP显然理解语义,并且你触及了可读性)。但是,我认为它不应该在任何地方使用。如果试图尽可能多地写出不可变的代码,它可以使函数变得冗长,丑陋和麻烦。有时候,变量会使代码变得更清洁。应该根据具体情况使用它们。 – 2014-09-22 15:43:04

+0

@MillieSmith,我明白了你的观点。在我看来,可变性应该是一个例外。尽管如此,只要不暴露可变状态,代码中的小变量不会杀死任何人。我会更新我的答案。 – 2014-09-22 15:51:33