亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么要創建“隱式解包選項”,因為這意味著您知道有一個值?

為什么要創建“隱式解包選項”,因為這意味著您知道有一個值?

寶慕林4294392 2019-06-28 15:22:23
為什么要創建“隱式解包選項”,因為這意味著您知道有一個值?為什么要創建一個“隱式非包裝可選”而不是只創建一個常規變量或常量?如果您知道可以成功地打開它,那么為什么首先創建一個可選項呢?例如,為什么:let someString: String! = "this is the string"比:let someString: String = "this is the string"如果“選項表示一個常量或變量被允許具有‘無值’,但”有時從程序的結構中可以清楚地看到,在第一次設置該值之后,可選項總是有一個值“,那么從一開始將其作為可選值有什么意義呢?如果你知道一個可選的東西總是有一個值,那不是說它不是可選的嗎?
查看完整描述

3 回答

?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

考慮一個對象的情況,它在構造和配置對象時可能具有零屬性,但在構造和配置過程中是不可變的和非零的(NSImage通常是這樣處理的,盡管在它的情況下,有時變異仍然是有用的)。隱式拆解選項將很好地清理其代碼,安全損失相對較低(只要有一個保證,它就安全了)。

(編輯)但要清楚:常規的選項幾乎總是更好。


查看完整回答
反對 回復 2019-06-28
?
MM們

TA貢獻1886條經驗 獲得超2個贊

在我描述隱式展開選項的用例之前,您應該已經了解了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當然不會很疼。


查看完整回答
反對 回復 2019-06-28
  • 3 回答
  • 0 關注
  • 878 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號