簡體   English   中英

UIViewController初始化方法中的隱式解包選項

[英]Implicitly Unwrapped Optionals in UIViewController init method

正如文檔所說“ 您確定可選項確實包含值,您可以通過添加感嘆號(!)來訪問其基礎值

那么為什么UIViewController使用init方法呢

init(nibName nibName: String!,bundle nibBundle: NSBundle!)

並告訴我“ 如果指定nil,則nibName屬性設置為nil。

為什么不使用init(nibName nibName: String?,bundle nibBundle: NSBundle?)

我對此很困惑。

從我的理解? 用於表示可選變量。 ! 用於訪問可選變量的值。 文件說

“一旦確定可選項確實包含值,就可以通過添加感嘆號(!)來訪問其基礎值”

這意味着使用! 只有當你確定它具有非零值時否則會拋出錯誤。 它就像強制一個可選變量有價值

然后關於你的問題

init(nibName nibName: String!,bundle nibBundle: NSBundle!)

這里的init函數強制調用者傳遞nibNamenibBundle的值。 它不能是零。 ! 用於確保參數具有非零值

注意:如果我錯了請糾正我,我只是學習:)

! 是一種純粹的語法糖。 變量仍然是可選的; 你可以使用它作為普通的可選項,傳遞nil等。它只需要你可以簡化為nibName而不是使用完整的nibName!

資源-

“這些類型的期權定義為隱式解包的期權。 你通過在你想要選擇的類型之后放置一個感嘆號( String! )而不是問號( String? )來編寫一個隱式解包的可選項。“...

“隱式展開的可選項是幕后的常規可選項,但也可以像非可選值一樣使用,無需在每次訪問時解包可選值。

摘錄自: Apple Inc.“The Swift Programming Language。”iBooks

init(nibName nibName: String!,bundle nibBundle: NSBundle!)

調用Objective C框架代碼。 這會調用initWithNibName:bundle。 您可以選擇傳遞此方法的參數nil。 目標C很好。 如果在initiWithNibName中傳遞nil,它會嘗試根據相關類的名稱為您解析名稱。 如果傳入nil for bundle,則將其替換為[NSBundle mainBundle]。

因此,Swift使此參數成為可選參數。 必須這樣做以允許變量可選地為零。 問題是為什么它不能使它成為一個標准的可選項,並要求你明確地打開它。 答案是隱式展開的可選項在將其傳遞給Objective C之前立即展開可選項。您不希望必須顯式解包此問題,因為一旦您傳入參數,無論是否為nil,您都已完成設置。 您不希望必須顯式解包它,然后將其傳遞給Objective C! 這樣做沒有任何意義。

我在本網站上發現了以下內容

在某些情況下,您可能絕對確定Objective-C方法或屬性永遠不會返回nil對象引用。 為了使這個特殊場景中的對象更方便使用,Swift將對象類型導入為隱式解包的選項。 隱式展開的可選類型包括可選類型的所有安全功能。 此外,您可以直接訪問該值而無需檢查nil或自行解包。 當您以這種可選類型訪問該值而不首先安全地解包它時,隱式解包的可選項檢查該值是否缺失。 如果缺少該值,則會發生運行時錯誤。 因此,除非您確定不會丟失該值,否則應始終自行檢查和解包隱式展開的可選項。

我不確定這是否有意義。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM