Swift Review#37[可失敗建構器Failable initializers]

--

前言

我當初在接觸建構器這個篇章的時候,就有先看到了可失敗建構器(Failable initializers)這個概念,不過那個時候我對於可選的概念其實是模糊的、對於建構器的概念也是模糊的,所以當時並沒有直接寫這個篇章的筆記,但如今既然兩者都已經是前面的篇章了,那也就是說,我們現在可以好好的對它進行探討了。

正文

100Days of Swift

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 than init(), and return nil 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,就可以初始化(建構化),如果不行,那就不能。

而在實體化時我這邊做了兩個結局的嘗試:

  1. 讓參數傳入“Davis”,也就是建了一個值為nil的實體adamOrNot,但由於adamOrNot本身就是一個未知的狀態,所以標上“?”,然後取用在他下面的name。
  2. 傳入“Adam”,讓實例符合建構器內部的要求,這個時候adam?.name就會是”Adam”。

總論上述的實作現象,我們可以說,init?( )可失敗初始化器這件事情可以是處理傳入參數的值的一種篩選器,假如條件符合,那就讓可選項的屬性變成是有值的狀態(以本例而言)。

所以也就是說,條件符合與否,是可失敗初始化器的一種特色。介於可以建構(初始化)和不能建構(初始化)之間。

不過,可失敗建構器可能還需要更多實作,才能完全掌握它的運用。

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

影山小麥機
影山小麥機

Written by 影山小麥機

本職為Mobile工程師,熱愛分享視野,也樂意站在ChatGPT的肩膀上。訂閱小麥機,收割技術、職涯、人生的難題。

No responses yet

Write a response