本文由NikoXu (iOS 愛好者) 翻譯
Swift Optionals:什么是Optional ?
Swift Optionals:何時使用'!'和'?' ?
Swift Optionals:何時使用'if-let' ?
Swift Optionals:何時使用'as?'和'as' ?
何時使用 祠丝?和 !
讓我們假設你有一個基于UIKit寫的iPhone 應用《叮現在你想在view controller使用一些代碼,使之能在屏幕里的view controller上出場一個新的view controller只祠。你打算通過navigation controller 來 push這個新的view controller到屏幕上瞎嬉。
正如你所知道的蝎毡,每個ViewController實例有一個navigationController的屬性。如果你想制作一個基于navigation controller的應用氧枣,這個屬性將在你的應用里被自動創(chuàng)建沐兵,而你可以用navigation控制器來push或者pop你所需要的view controllers。如果你使用了single app project的模板便监,Xcode不會自動為你自動創(chuàng)建navigation controller扎谎,因此你的應用的默認view controller不會創(chuàng)建** navigationController**的屬性碳想。
我想你已經想到這個場景很適合使用Optional數據類型。如果你查看UIViewController的文檔你會發(fā)現navigationController 是這樣被定義在庫里面的:
var navigationController: UINavigationController? { get }
那么讓我們回到我們使用場景毁靶。如果你能肯定你的view controller總是擁有一個 navigation controller胧奔,那么你就可以對它直接強行解包(force unwrap):
controller.navigationController!.pushViewController(myViewController, animated: true)
當你在屬性名稱之后標記上' ! ',那么就相當于告訴編譯器“我不在乎這個屬性是optional的预吆,我知道這塊代碼在執(zhí)行的整個過程中都是有值的狀態(tài)葡盗,把這個optional類型當作普通的數據類型對待就行”。這樣做好嗎啡浊?而當你的view controller 不存在這樣一個navigation controller的時候會發(fā)生什么呢觅够?還是將一個錯誤的值一直被存儲在navigation controller里?你看到的結果將是你的應用會崩潰掉巷嚣,正如你的代碼一樣不完善和難看喘先。
因此,使用 '!' 僅僅適合你101%確定這樣做是安全的廷粒。
那么當我們不能確定這個屬性是一個navigation controller對象該如何做呢窘拯?這時你可以使用 '?' 取代 '!' :
controller.navigationController?.pushViewController(myViewController, animated: true)
在屬性名稱后面添加的'?'便是告訴編譯器這個屬性是否為nil,那么:當它不為nil的時候使用它坝茎,否則就把它當做一個真正的nil對象涤姊。'?'符號讓你更加高效靈活的使用navigation controller。而不需要檢查類型或者在類型之間做轉換嗤放。當你不知道是否是一個navigation controller對象卻希望只有當它是一個navigation controller對象用它做點什么的情況下思喊,這樣的語法是非常完善且實用的。
了解更多'!'和'?'使用技巧請閱讀可選鏈式調用 Optional Chaining
這樣真的很棒次酌!但是如果你希望在它不是一個navigation controller對象的情況下做點什么的時候該怎么做呢恨课?比如此時顯示一個給用戶解釋情況的警示窗口。
這時你需要使用的是if-let語法岳服。
如何使用Optionals請閱讀##
Swift Optionals:什么是Optional ?
Swift Optionals:何時使用'!'和'?' ?
Swift Optionals:何時使用'if-let' ?
Swift Optionals:何時使用'as?'和'as' ?
翻譯菌: 因為是分次翻譯的剂公,所以把原文分成4個較小的篇幅來翻譯的。在學習Swift的路途上吊宋,如有不妥纲辽,望指正。