为什么要创建“隐式解包选项”,因为这意味着您知道有一个值?

为什么要创建“隐式解包选项”,因为这意味着您知道有一个值?

为什么要创建一个“隐式非包装可选”而不是只创建一个常规变量或常量?如果您知道可以成功地打开它,那么为什么首先创建一个可选项呢?例如,为什么:

let someString: String! = "this is the string"

比:

let someString: String = "this is the string"

如果“选项表示一个常量或变量被允许具有‘无值’,但”有时从程序的结构中可以清楚地看到,在第一次设置该值之后,可选项总是有一个值“,那么从一开始将其作为可选值有什么意义呢?如果你知道一个可选的东西总是有一个值,那不是说它不是可选的吗?


宝慕林4294392
浏览 778回答 3
3回答

慕田峪9158850

考虑一个对象的情况,它在构造和配置对象时可能具有零属性,但在构造和配置过程中是不可变的和非零的(NSImage通常是这样处理的,尽管在它的情况下,有时变异仍然是有用的)。隐式拆解选项将很好地清理其代码,安全损失相对较低(只要有一个保证,它就安全了)。(编辑)但要清楚:常规的选项几乎总是更好。

MM们

在我描述隐式展开选项的用例之前,您应该已经了解了SWIFT中的选项和隐式未包装选项。如果你没有,我建议你先读我关于选拔赛的文章何时使用隐式未包装的可选项有两个主要原因,一个是创建隐式解包装的可选项。所有这些都与定义一个在nil否则,SWIFT编译器将总是强制您显式地打开一个可选的包。1.在初始化过程中不能定义的常量每个成员常量必须在初始化完成之前具有一个值。有时,在初始化期间不能用其正确的值初始化一个常量,但仍然可以保证它在被访问之前具有一个值。使用可选变量可以避免此问题,因为可选变量将自动初始化为nil它最终包含的值仍然是不变的。但是,不断地展开变量可能会带来痛苦,因为您知道这个变量肯定不是零。隐式解包选项实现了与可选项相同的好处,增加的好处是不必在任何地方显式地展开它。这方面的一个很好的例子是,在加载视图之前,无法在UIView子类中初始化成员变量:class MyView: UIView {     @IBOutlet var button: UIButton!     var buttonOriginalWidth: CGFloat!     override func awakeFromNib() {         self.buttonOriginalWidth = self.button.frame.size.width    }}在这里,在视图加载之前不能计算按钮的原始宽度,但您知道awakeFromNib将在视图上的任何其他方法(初始化除外)之前调用。与其强制在类中无意义地显式地展开值,还可以将其声明为隐式未包装的可选项。2.当应用程序无法从变量中恢复时nil这应该是非常罕见的,但是如果您的应用程序不能继续运行,如果变量是nil当被访问时,费时费力地对其进行测试是一种浪费时间。nil..通常,如果您的应用程序要继续运行,必须有一个绝对正确的条件,则可以使用assert..隐式未包装的可选项中包含了一个Assertfornil。即使如此,如果选项为0,那么打开可选的包并使用更具描述性的断言通常是好的。当不使用隐式未包装的可选项时1.计算迟缓的成员变量有时,您的成员变量不应为零,但在初始化期间不能将其设置为正确的值。一种解决方案是使用隐式未包装的可选项,但更好的方法是使用惰性变量:class FileSystemItem {}class Directory : FileSystemItem {     lazy var contents : [FileSystemItem] = {         var loadedContents = [FileSystemItem]()         // load contents and append to loadedContents        return loadedContents    }()}现在,成员变量contents在第一次访问时才初始化。这使类在计算初始值之前有机会进入正确的状态。注:这似乎与上面的第一条相矛盾。然而,有一个重要的区别有待作出。这个buttonOriginalWidth必须在viewDidLoad期间设置上面的内容,以防止任何人在访问属性之前更改按钮宽度。2.其他地方在大多数情况下,应该避免隐式未包装选项,因为如果使用错误,则整个应用程序在访问时会崩溃。nil..如果您不确定变量是否可以为零,请始终默认使用普通可选项。展开一个变量,这个变量永远不会nil当然不会很疼。
打开App,查看更多内容
随时随地看视频慕课网APP