在我描述隱式展開選項(xiàng)的用例之前,您應(yīng)該已經(jīng)了解了SWIFT中的選項(xiàng)和隱式未包裝選項(xiàng)。如果你沒有,我建議你先讀 我關(guān)于選拔賽的文章
何時使用隱式未包裝的可選項(xiàng) 有兩個主要原因,一個是創(chuàng)建隱式解包裝的可選項(xiàng)。所有這些都與定義一個在 nil
否則,SWIFT編譯器將總是強(qiáng)制您顯式地打開一個可選的包。
1.在初始化過程中不能定義的常量 每個成員常量必須在初始化完成之前具有一個值。有時,在初始化期間不能用其正確的值初始化一個常量,但仍然可以保證它在被訪問之前具有一個值。
使用可選變量可以避免此問題,因?yàn)榭蛇x變量將自動初始化為 nil
它最終包含的值仍然是不變的。但是,不斷地展開變量可能會帶來痛苦,因?yàn)槟肋@個變量肯定不是零。隱式解包選項(xiàng)實(shí)現(xiàn)了與可選項(xiàng)相同的好處,增加的好處是不必在任何地方顯式地展開它。
這方面的一個很好的例子是,在加載視圖之前,無法在UIView子類中初始化成員變量:
class MyView: UIView {
@IBOutlet var button: UIButton!
var buttonOriginalWidth: CGFloat!
override func awakeFromNib() {
self.buttonOriginalWidth = self.button.frame.size.width }} 在這里,在視圖加載之前不能計(jì)算按鈕的原始寬度,但您知道 awakeFromNib
將在視圖上的任何其他方法(初始化除外)之前調(diào)用。與其強(qiáng)制在類中無意義地顯式地展開值,還可以將其聲明為隱式未包裝的可選項(xiàng)。
2.當(dāng)應(yīng)用程序無法從變量中恢復(fù)時 nil
這應(yīng)該是非常罕見的,但是如果您的應(yīng)用程序不能繼續(xù)運(yùn)行,如果變量是 nil
當(dāng)被訪問時,費(fèi)時費(fèi)力地對其進(jìn)行測試是一種浪費(fèi)時間。 nil
..通常,如果您的應(yīng)用程序要繼續(xù)運(yùn)行,必須有一個絕對正確的條件,則可以使用 assert
..隱式未包裝的可選項(xiàng)中包含了一個Assertfornil。即使如此,如果選項(xiàng)為0,那么打開可選的包并使用更具描述性的斷言通常是好的。
當(dāng)不使用隱式未包裝的可選項(xiàng)時 1.計(jì)算遲緩的成員變量 有時,您的成員變量不應(yīng)為零,但在初始化期間不能將其設(shè)置為正確的值。一種解決方案是使用隱式未包裝的可選項(xiàng),但更好的方法是使用惰性變量:
class FileSystemItem {}class Directory : FileSystemItem {
lazy var contents : [FileSystemItem] = {
var loadedContents = [FileSystemItem]()
// load contents and append to loadedContents return loadedContents }()} 現(xiàn)在,成員變量 contents
在第一次訪問時才初始化。這使類在計(jì)算初始值之前有機(jī)會進(jìn)入正確的狀態(tài)。
注: 這似乎與上面的第一條相矛盾。然而,有一個重要的區(qū)別有待作出。這個 buttonOriginalWidth
必須在viewDidLoad期間設(shè)置上面的內(nèi)容,以防止任何人在訪問屬性之前更改按鈕寬度。
2.其他地方 在大多數(shù)情況下,應(yīng)該避免隱式未包裝選項(xiàng),因?yàn)槿绻褂缅e誤,則整個應(yīng)用程序在訪問時會崩潰。 nil
..如果您不確定變量是否可以為零,請始終默認(rèn)使用普通可選項(xiàng)。展開一個變量,這個變量永遠(yuǎn)不會 nil
當(dāng)然不會很疼。