[英]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函數強制調用者傳遞nibName
和nibBundle
的值。 它不能是零。 !
用於確保參數具有非零值
注意:如果我錯了請糾正我,我只是學習:)
!
是一種純粹的語法糖。 變量仍然是可選的; 你可以使用它作為普通的可選項,傳遞nil
等。它只需要你可以簡化為nibName
而不是使用完整的nibName!
資源-
“這些類型的期權定義為隱式解包的期權。 你通過在你想要選擇的類型之后放置一個感嘆號(
String!
)而不是問號(String?
)來編寫一個隱式解包的可選項。“...“隱式展開的可選項是幕后的常規可選項,但也可以像非可選值一樣使用,無需在每次訪問時解包可選值。 ”
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! 這樣做沒有任何意義。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.