Swift Optionals - 不同的展开方式

Nil*_*ne- 2 optional ios swift forced-unwrapping

我会正确的:

有什么区别:

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

if test != nil {
    println("\(test!) IS NOT nil")
} else {
    println("test is nil")
}
Run Code Online (Sandbox Code Playgroud)

if let test = test {
    println("\(test) IS NOT nil")
} else {
    println("test is nil")
}
Run Code Online (Sandbox Code Playgroud)

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

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

两种方法都是有效的,并且有不同的情况,其中一种被认为是更好的选择吗?

Rob*_*ier 5

这两种方法都是有效的,并且有哪些方案被认为是更好的选择?

if-let形式是在任何情况下,它可以工作在更好的选择.正确的方法发音!就是"我发誓,我的计划的生活,"因为你是.

你的例子是琐碎的形式,并且在琐碎的形式中很难看出问题是如何发生的.我刚刚对此进行测试nil.怎么可能出错?但软件增长和软件变化.您的!= nil检查与人们已经使用了几十年的C和Java检查相同,并导致程序崩溃数十年.实际上很容易错过必要但非编译器要求的测试.人们总是那么做.

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

如果你忘了测试nilif-let,那么编译器会阻止你.如果你忘记测试!= nil,崩溃会阻止你; 希望,如果你很幸运,在单元测试中.如果不是那么幸运,在现场.

也就是说,这if-let不是唯一的好机制.你也可以map选择,使用nil coalescing(??),可选链接(?.),这些都是避免bug的优秀工具.但Apple !故意选择(在Unix中被严重称为"爆炸").它很危险,只有在其他选项不可行时才应谨慎使用.

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