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-let
forms都是更好的select。正确的发音方式!
是“我发誓我的计划的生活”,因为你是。
你的例子是微不足道的forms,而在这个微不足道的forms中很难看出问题是如何发生的。 我只是testing这个对nil
。 有什么可能出错? 但是软件的增长和软件的改变。 您的!= nil
检查与人们几十年来使用的C和Java检查相同,并导致程序崩溃数十年。 事实上很容易错过一个必要但不是编译器所需的testing。 人们一直在做
当你重新排列你的代码并将println
移到一个函数中时,你是否还记得移动if
testing? 在一个大的函数中, if
testing可能在顶部完成,你记得在使用之前做所有的testing!
? 重构之后,这是否仍然如此? 错误修复后? 对于每个代码更改?
如果你忘记用if-let
来testingnil
,那么编译器会阻止你。 如果你忘记用!= nil
来testing,崩溃会阻止你; 希望如果你非常幸运,在unit testing。 如果不是那么幸运的话,
这就是说, if-let
不是唯一的好机制。 你也可以map
optionals,使用nil coalescing( ??
),可选的链接( ?.
),这些都是很好的避免bug的工具。 但苹果select了!
(这在Unix中被严重地称为“砰”)。 这是危险的,只有在其他选项不可行的情况下,才应该非常小心地使用。
最后,如果您完美地编写代码,那么不需要编译器施加的安全性。 你可以用汇编语言编写你的代码,完全用全局内存编写,并且避免我们使用抽象的许多代价。 但是人类程序员往往会犯很多小错误,这就是为什么你应该避免!
。