Swift Optionals – 不同的展开方式

我会正确地做到这一点:

有什么区别:

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") } 

两个输出结果都在操场上。

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

这两种方法是否有效?是否有不同的情况,哪一种被认为是更好的select?

这两种方法都是有效的吗?在不同的情况下,哪一种被认为是更好的select?

在任何情况下, if-letforms都是更好的select。正确的发音方式! 是“我发誓我的计划的生活”,因为你是。

你的例子是微不足道的forms,而在这个微不足道的forms中很难看出问题是如何发生的。 我只是testing这个对nil 。 有什么可能出错? 但是软件的增长和软件的改变。 您的!= nil检查与人们几十年来使用的C和Java检查相同,并导致程序崩溃数十年。 事实上很容易错过一个必要但不是编译器所需的testing。 人们一直在做

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

如果你忘记用if-let来testingnil ,那么编译器会阻止你。 如果你忘记用!= nil来testing,崩溃会阻止你; 希望如果你非常幸运,在unit testing。 如果不是那么幸运的话,

这就是说, if-let不是唯一的好机制。 你也可以map optionals,使用nil coalescing( ?? ),可选的链接( ?. ),这些都是很好的避免bug的工具。 但苹果select了! (这在Unix中被严重地称为“砰”)。 这是危险的,只有在其他选项不可行的情况下,才应该非常小心地使用。

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