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)
两者都在操场上输出相同的结果.
我知道隐式解包不被认为是安全的(在大多数情况下),但是,我在这里检查在打开之前值是否为零?
两种方法都是有效的,并且有不同的情况,其中一种被认为是更好的选择吗?
这两种方法都是有效的,并且有哪些方案被认为是更好的选择?
该if-let形式是在任何情况下,它可以工作在更好的选择.正确的方法发音!就是"我发誓,我的计划的生活,"因为你是.
你的例子是琐碎的形式,并且在琐碎的形式中很难看出问题是如何发生的.我刚刚对此进行了测试nil.怎么可能出错?但软件增长和软件变化.您的!= nil检查与人们已经使用了几十年的C和Java检查相同,并导致程序崩溃数十年.实际上很容易错过必要但非编译器要求的测试.人们总是那么做.
当您重新排列代码并移动println到函数中时,您是否还记得移动if测试?在一个大型函数中,if测试可能在顶部完成,你是否还记得在使用前完成所有测试!?重构后这是否仍然如此?修复bug后?对于每个代码更改?
如果你忘了测试nil用if-let,那么编译器会阻止你.如果你忘记测试!= nil,崩溃会阻止你; 希望,如果你很幸运,在单元测试中.如果不是那么幸运,在现场.
也就是说,这if-let不是唯一的好机制.你也可以map选择,使用nil coalescing(??),可选链接(?.),这些都是避免bug的优秀工具.但Apple !故意选择(在Unix中被严重称为"爆炸").它很危险,只有在其他选项不可行时才应谨慎使用.
最后,如果您完美地编写代码,则不需要编译器强加的安全性.您可以使用全局内存在汇编程序中编写代码,并避免我们使用的许多抽象成本.但是人类程序员往往会犯很多小错误,这就是你应该避免的原因!.
| 归档时间: |
|
| 查看次数: |
550 次 |
| 最近记录: |