2

我会直接说:

有什么区别:

var test: String?
test = "this is an optional string"

if test != nil {
    println("\(test!) IS NOT nil")
} else {
    println("test is nil")
}

if let test = test {
    println("\(test) IS NOT nil")
} else {
    println("test is nil")
}

两者都在操场上输出相同的结果。

我知道隐式展开不被认为是安全的(在大多数情况下)但是,在这里我在展开之前检查这些值是否为零?

两种方法都有效吗?是否存在不同的场景,其中一种被认为是更好的选择?

4

1 回答 1

5

两种方法都有效吗?是否存在不同的场景,其中一种被认为是更好的选择?

if-let它可以工作的任何情况下,形式都是更好的选择。正确的发音方式!是“我对我的程序的生命发誓”,因为你是。

你的例子是平凡的形式,在平凡的形式中,很难看出问题是如何发生的。我只是针对nil. 会出什么问题?但是软件在增长,软件也在变化。您的!= nil检查与人们使用了几十年的 C 和 Java 检查相同,并且几十年来一直导致程序崩溃。事实上,很容易错过必要但不是编译器需要的测试。人们总是这样做。

当你重新排列你的代码并将其移动println到一个函数中时,你还记得移动if测试吗?在一个大型函数中,if测试可能在顶部完成,您是否记得在使用之前完成所有这些测试!?重构后是否仍然如此?错误修复后?每次代码更改?

如果您忘记测试nilwith if-let,那么编译器会阻止您。如果您忘记使用 进行测试!= nil,崩溃会阻止您;希望,如果你很幸运,在单元测试中。如果不是那么幸运,在外地。

也就是说,if-let不是唯一的好机制。您还可以使用可map选项、使用 nil 合并 ( ??)、可选链接 ( ?.),这些都是避免错误的绝佳工具。但是 Apple!是故意选择的(在 Unix 中被严重称为“bang”)。这是危险的,只有在其他选项不可行时才应谨慎使用。

最后,如果您完美地编写代码,则不需要编译器强加的安全性。您可以在汇编程序中编写代码,完全使用全局内存,并避免我们使用的许多抽象成本。但是人类程序员往往会犯很多小错误,这就是为什么你应该避免!.

于 2015-01-02T14:52:34.787 回答