【问题标题】:Swift: when should I use "var" instead of "let"?斯威夫特:我什么时候应该使用“var”而不是“let”?
【发布时间】:2015-04-07 02:09:38
【问题描述】:

正如苹果文档所说:

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

让我们考虑一些类:

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

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

class B {
    let b = A()
}

即使b 是可变的,let 关键字也可以,因为引用不会改变。另一方面,var 也可以,因为b 的内容可以更改。在这个例子中我应该选择什么 - let 或 var?

【问题讨论】:

  • 您始终可以使用var,而您可以使用let。 let 只告诉程序的其余部分不能重新分配该元素
  • 我通常只是向后弯腰,让一切都顺其自然。 immutable > mutable 并且即使在您的第二个示例中无关紧要,我也放了 let 以提醒我这一点。

标签: swift


【解决方案1】:

当你用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关键字”创建了一个新变量“a”,并赋值为“1”。当我打印“a”时,我得到的输出为 1。然后我将 2 分配给“var a”,即我正在修改变量“a”的值。我可以做到这一点而不会出现编译器错误,因为我将它声明为 var。

在第二个场景中,我使用“let 关键字”创建了一个新变量“b”并分配了值“4”。当我打印“b”时,我得到 4 作为输出。然后我尝试将 5 分配给“let b”,即我正在尝试修改“let”变量,但出现编译时错误“无法赋值:‘b’是‘let’常量”。

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

【讨论】:

    【解决方案2】:

    当您的对象在设置值后不更改其值时,请使用 let。 如果您的对象可以更改其值超过 1 次,请使用 var。

    'let' 是为了康斯坦斯。 '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】:

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

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

      在这个例子中,一个人只有一个头,在每个Person 的生命周期内,他/她的头将始终是同一个头。但是,该头部的毛发可能会长出、脱落或以其他方式发生变化。 Person 对该头部的所有权与 Head 与其毛发的关系无关。

      正如 Rob 所说,您应该始终使用 let,除非您有充分的理由不这样做。在推理程序行为时,不变性是您的朋友。

      【讨论】:

        【解决方案4】:

        尽可能使用let。必要时使用var。使事物不可变使许多错误成为不可能,因此它应该是您的默认选择。尽可能在init 中设置所有值,并且永远不要更改它们。同样,您应该尽可能使用struct,并在必要时使用class(尽管根据我的经验,这比使用let 更难实现)。

        所以在你的例子中,如果你不能在初始化期间设置A.a,那么是的,它应该是var。但是在您的示例中没有必要将var 用于B.b。 (在这两个例子中都没有理由使用class,至少在你提出问题的方式上。)

        【讨论】:

          猜你喜欢
          • 2014-03-21
          • 1970-01-01
          • 2011-09-11
          • 2021-10-14
          • 2016-02-09
          • 2015-05-12
          • 1970-01-01
          • 2017-07-22
          • 2017-03-24
          相关资源
          最近更新 更多