第一篇附加:牺牲小马🐴
这里是原文地址 原文链接
本篇讲了一些可以用到! 强制解包的情况,是第一篇的一点附加。
1. IBOutlets + Dependency Injection
当使用OBoutlets 和 Dependency Injection(依赖注入)的时候,这两种情况下,会在初始化之后马上得到值。当你使用他们的时候,他们肯定不会是空。这时,可以使用强制解包。
2. UIImage, UIStoryboard, UITableViewCell
需要使用名字或者identifier这种常量去生成的。
UIImage(named: …)
UIStoryboard(name:,bundle:)
UIStoryboard.instantiateViewControllerWithIdentifier(_:)
UITableView.dequeueReusableCellWithIdentifier(_:, forIndexPath:)
// and some other similar stuff… 类似的情况
对这些情况,如果你想让你的程序崩溃,以便你提前发现去修复这些错误,如你bundle中没有该名字的图片,或者identifier没有设置或写错。
对这些情况,你可以使用guard的写法来提供更多的准确的信息来辅助你找到该错误
guard let cell = tableView.dequeueReusableCellWithIdentifier("foo", forIndexPath:indexPath) as? MyCustomCell else {
fatalError("cell with identifier 'foo' and class 'MyCustomCell' not found. "
+ "Check that your XIB/Storyboard is configured properly.")
}
3.
本系列文章的第一部分更多的是面向Swift新手,因为他们总是强迫解包,因为Xcode告诉他们,或者因为他们没有真正理解为什么Optionals对他们有好处。这就是为什么我没有谈到那些我认为更加高级的用例。
所以可以在有些情况下使用!。但是,我仍然认为,第1部分的建议是:只用!如果你真的明白你为什么使用它的时候。