斯威夫特:什么时候应该使用“var”而不是“let”?

时间:2015-02-06 20:24:02

标签: swift

Apple文档说:

  

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

让我们考虑一下课程:

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

由于数组a是可变的,因此它是通过var定义的。但是如果我们考虑B类,A的实例是属性呢?

class B {
    let b = A()
}

即使b是可变的,let关键字也可以,因为参考不会被更改。另一方面,var也可以,因为b的内容可以更改。我应该在此示例中选择哪些内容 - letvar

4 个答案:

答案 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”常量”。

来源:https://thenucleargeeks.com/2019/04/10/swift-let-vs-var/