Apple文档说:
使用
let
制作常量,var
制作变量。在编译时不需要知道常量的值,但是必须为其分配一次值。这意味着您可以使用常量来命名您确定一次但在许多地方使用的值。
让我们考虑一下课程:
class A {
var a = [String]()
}
由于数组a
是可变的,因此它是通过var
定义的。但是如果我们考虑B类,A的实例是属性呢?
class B {
let b = A()
}
即使b
是可变的,let
关键字也可以,因为参考不会被更改。另一方面,var
也可以,因为b
的内容可以更改。我应该在此示例中选择哪些内容 - let
或var
?
答案 0 :(得分:8)
尽可能使用let
。必要时使用var
。使事物不可变会使很多错误成为不可能,所以它应该是你的默认选择。尽可能在init
中设置所有值,但不要更改它们。同样,您应尽可能使用struct
,必要时使用class
(尽管根据我的经验,这比使用let
更难实现。)
因此,在您的示例中,如果您在初始化期间无法设置A.a
,那么是的,它应该是var
。但是,您的示例中无需将var
用于B.b
。 (并且在任何一个示例中都没有理由使用class
,至少在您提出问题的方式中。)
答案 1 :(得分:2)
让我们给出更好的名字,以帮助我们推理。我们说
class Head {
var hairs = [String]()
}
class Person {
let head = Head()
}
在这个例子中,一个人只有一个头,并且在每个Person
的生命周期中,他/她的头总是那个头。然而,头部的毛发可以生长,脱落或以其他方式改变。 Person
对这个头部的所有权与Head
与头发的关系无关。
正如Rob所说,你应该总是使用let
,除非你有充分的理由不这样做。在推理程序行为方面,不变性是你的朋友。
答案 2 :(得分:1)
在设置值后,如果对象未更改其值,请使用let。 如果您的对象可以更改其值超过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
答案 3 :(得分:0)
使用var声明变量时,表示可以更新,可以更改,可以修改值。
使用let声明变量时,意味着它无法更新,它是非变量,其值不能修改。
var a = 1
print (a) // output 1
a = 2
print (a) // output 2
let b = 4
print (b) // output 4
b = 5 // error "Cannot assign to value: 'b' is a 'let' constant"
让我们理解上面的示例:我们创建了一个带有“ var keyword”的新变量“ a”,并为其分配了值“ 1”。当我打印“ a”时,输出为1。然后将2分配给“ var a”,即我正在修改变量“ a”的值。我可以做到这一点而不会出现编译器错误,因为我将其声明为var。
在第二种情况下,我用“ let keyword”创建了一个新变量“ b”,并将值分配为“ 4”。当我打印“ b”时,我得到4作为输出。然后,我尝试将5分配给“ let b”,即尝试修改“ let”变量,然后出现编译时错误“无法分配给值:“ b”是“ let”常量”。