前言
我當初在接觸建構器這個篇章的時候,就有先看到了可失敗建構器(Failable initializers)這個概念,不過那個時候我對於可選的概念其實是模糊的、對於建構器的概念也是模糊的,所以當時並沒有直接寫這個篇章的筆記,但如今既然兩者都已經是前面的篇章了,那也就是說,我們現在可以好好的對它進行探討了。
正文
This is a failable initializer: an initializer that might work or might not. You can write these in your own structs and classes by using
init?()
rather thaninit()
, and returnnil
if something goes wrong. The return value will then be an optional of your type, for you to unwrap however you want.
翻譯翻譯:
一個建構器可能運作、可能不會運作,你可以在你的結構、類別中使用它,以關鍵字init?( )取代init( ),這樣的話,就可以在發生問題時返回nil。
而返回值隨即會在你的型別中變成一個可選項,在你手上,你可以依據情況解包。
Swift起步走:
類別、結構或是列舉在建構過程中可能失敗,這個失敗可能是傳入無效的參數、缺少某種外部需要的資源或是沒有滿足某種必要條件。
為了處理這種可能失敗的情況,可以定義一個可失敗建構器(failable initializer
),使用方式為在init
後面加上一個問號?
:init?
。

如上述,我們在第2行創建了一個name的變數,設為String可選,然後由於不知道name會不會等於String,所以也就是說,我們初始化(建構化)的條件還未知,所以,我們先設置一個可失敗建構器:
如果名字等於Adam,就可以初始化(建構化),如果不行,那就不能。
而在實體化時我這邊做了兩個結局的嘗試:
- 讓參數傳入“Davis”,也就是建了一個值為nil的實體adamOrNot,但由於adamOrNot本身就是一個未知的狀態,所以標上“?”,然後取用在他下面的name。
- 傳入“Adam”,讓實例符合建構器內部的要求,這個時候adam?.name就會是”Adam”。
總論上述的實作現象,我們可以說,init?( )可失敗初始化器這件事情可以是處理傳入參數的值的一種篩選器,假如條件符合,那就讓可選項的屬性變成是有值的狀態(以本例而言)。
所以也就是說,條件符合與否,是可失敗初始化器的一種特色。介於可以建構(初始化)和不能建構(初始化)之間。
不過,可失敗建構器可能還需要更多實作,才能完全掌握它的運用。