2015-02-06 145 views
1

由于苹果的文件说:Swift:我应该什么时候使用“var”而不是“let”?

使用let使常量和var,使一个变量。在编译时不需要知道常量的值,但必须为其赋值一次。这意味着您可以使用常量来命名一次您确定一次但在许多地方使用的值。

让我们来看一些类:

class A { 
    var a = [String]() 
} 

由于阵列a是可变的,它通过定义var。但是如果我们考虑B类,那么A的实例是财产?

class B { 
    let b = A() 
} 

即使b是可变的,let关键字都会好起来的,因为参考不会改变。另一方面,var也可以,因为b的内容可以更改。我应该在这个例子中选择什么 - letvar

+0

你可以随时使用'var'在那里你可以使用'let'。 'let'只告诉程序的其余部分,这个元素不能被重新赋值 – njzk2 2015-02-06 20:28:24

+1

你有没有看到[swift中'let'和'var'有什么区别?](http://stackoverflow.com/questions/ 24002092/let-and-var-in-swift之间的区别是什么)? – 2015-02-06 20:30:47

+2

我通常只是向后弯,让所有东西都可以。不可变的>可变的,即使在你的第二个例子中并不重要,我放过让我想起那个。 – 2015-02-06 20:33:43

回答

8

只要你可以使用let。必要时使用var。使事物不可变使得很多错误不可能发生,所以它应该是你的默认选择。尽可能将init中的所有值都设置好,并且永不改变它们。同样,你可以使用struct,必要时使用class(尽管根据我的经验,这比使用let更难实现)。

那么在你的例子中,如果在初始化过程中你不能设置A.a,那么是的,它应该是var。但在您的示例中,无需使用var代替B.b。 (在任何一个示例中,没有任何理由使用class,至少在您提出问题的方式中是如此。)

2

让我们给出这些更好的名称来帮助我们推理。比方说,

class Head { 
    var hairs = [String]() 
} 

class Person { 
    let head = Head() 
} 

在这个例子中,一个人有且只有一个头,每个Person的一生中,他/她的头部将始终是相同的头部。但是,头部的头发可能会长大,掉出或以其他方式改变。 Person该头的所有权与Head与头发的关系没有影响。

正如Rob提到的,除非有充分的理由,否则应该始终使用let。当涉及到关于程序行为的推理时,不变性是你的朋友。

1

使用让当你的对象没有改变它的值后设置了一个值。 如果您的对象可以更改其值超过1次,请使用var。

'let'是constance。 'var'是可变的东西。

但是,如果对象是类的实例(值通过引用传递),则常量限制仅应用于对象,而不应用于其属性。根据这些属性的类型(常量或变量),我们可以在之后更改它们的值。这不适用于结构。

例如:

class VideoMode { 
    var interlaced = false 
    var frameRate = 0.0 
    var name: String? 
} 
在功能

,你声明

let vm = VideoMode() 
print("starting framerate is \(vm.frameRate)") // -> print starting framerate is 0.0 
vm.frameRate = 20.0 
print("framerate now is \(vm.frameRate)") // -> print framerate now is 20.0 

//we can change .frameRate later to 10.0, there is no compile error 
vm.frameRate = 10.0 
print("framerate now is \(vm.frameRate)") // -> print framerate now is 10.0