为啥在 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 已初始化。为啥? [复制]