为啥在 Swift 中使用“let”而不是 var?

Posted

技术标签:

【中文标题】为啥在 Swift 中使用“let”而不是 var?【英文标题】:Why is "let" used instead of var in Swift?为什么在 Swift 中使用“let”而不是 var? 【发布时间】:2015-02-17 04:10:44 【问题描述】:

在此页面http://www.raywenderlich.com/85578/first-core-data-app-using-swift 上,许多示例使用 let 而不是 var

func tableView(tableView: UITableView,
  cellForRowAtIndexPath
  indexPath: NSIndexPath) -> UITableViewCell 

  let cell =
      tableView.dequeueReusableCellWithIdentifier("Cell")
      as UITableViewCell

  let person = people[indexPath.row]
  cell.textLabel!.text = person.valueForKey("name") as String?

  return cell

我在很多教程中都看到了这一点。是否有理由在上述 sn-p 中使用 let 而不是 var

【问题讨论】:

【参考方案1】:

事实上,作为一名 Swift 程序员,要问的问题是为什么使用var 而不是let?这是 Swift 在语义上与 C# 等其他语言有很大不同的一个领域。

原因是一旦您获得对表格单元格的引用,该引用在每次调用此方法的生命周期内都不会改变。没有重新分配给cell,因为根本没有理由这样做。因此没有理由将cell 设为变量。

一般来说,在 Swift 中,你应该default to using let, and only use var if you need to reassign。请记住,let 只会防止常量本身被重新分配;在这种情况下,您仍然可以改变被引用的对象,就像在 cell.textLabel!.text = person... 中所做的那样。

Apple's documentation 中进一步介绍了其他细微差别,但这适用于大多数情况。

【讨论】:

在使用let 而不是var 方面是否有任何编译器改进? var 慢吗?它只是表示语义吗? @Bjorn Tipling:编译器不会让你重新分配给使用 let 声明的常量,如果它注意到你尝试这样做,无论是错误的还是故意的,都会出错。跨度> 我正在与 c# 进行比较,其中以上都是变量。将所有内容都声明为常量似乎很奇怪。但我同意如果存储永远不会改变,let 可以工作。 @BoltClock: textLabel 后面的 bang 语法是什么? @4thSpace:这被称为强制展开,其中cell.textLabel 是可选的,当你知道它在特定时间点总是有一个值时,你正在展开它的值(所以你不要'不必每次都进行零检查)。在这种情况下,这意味着您知道单元格 总是 有一个文本标签,因此您可以立即获取对标签的引用。

以上是关于为啥在 Swift 中使用“let”而不是 var?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Node.js 通常使用 'var' 而不是 'let'?

为啥许多javascript示例仍然使用'var'而不是'const'和'let'? [关闭]

Swift: let 未初始化,但 var 已初始化。为啥? [复制]

在 Swift 中创建实例时是不是使用 var 或 let?

为啥 var 不被弃用?

为啥我不能在 Swift 中使用 let in 协议?