Swift 101:揭開 Swift 初始化器的神秘面紗(第 1 部分)


現在 Apple 已經正式發布了 Xcode 6 並且 NDA 已經解除,是時候深入了解 Swift 了,這是 Apple 用於構建 iOS 應用程序的新語言。 學習如何在 Swift 中正確使用初始化器一開始可能會讓人望而生畏。 Swift 要求對存儲在類中的所有屬性進行初始化,從而使初始化過程複雜化。這篇由兩部分組成的文章的第 1 部分揭開了初始化程序的神秘面紗,同時提供了一種動手方法來學習如何在自定義類中最好地實現它們。

在 Swift 中創建自己的自定義類時,您需要確保從自定義類實例化的新對像已正確初始化(準備好使用)。這通常涉及確保所有存儲的屬性都具有初始值,以及該類可能需要的任何其他特化。

Swift 要求你初始化所有存儲的屬性。不允許未知狀態。在屬性中存儲初始值主要有兩種方式。

  1. 在財產聲明中 – 例子:

  1. 在初始化器中 – 例子:

如果屬性的初始值始終相同,則應選擇第一個選項並在屬性聲明中初始化值。這將屬性的初始化與其聲明緊密聯繫在一起,使您的代碼更直觀。

如果屬性的初始值已更改,則應選擇初始值設定項。

初始化和類型推斷

如果將初始值存儲在屬性聲明中,則無需指定屬性類型。這是因為 Swift 可以根據其類型計算或推斷您存儲在屬性中的值的類型。

但是,如果在初始化程序中設置屬性的初始值,則必須在聲明屬性時指定屬性類型。

創建一個初始化器

以下是管理初始化程序的一些基本規則:

  • Swift 初始化器總是被命名 裡面.
  • 你不使用 功能 聲明初始化器時的關鍵字。
  • 初始化器不返回值。
  • 您可以為接受不同參數的類創建多個初始化程序。
  • 如果該類具有超類,則必須從自定義初始化程序中調用指定的初始化程序之一(稍後會詳細介紹)。

初始化參數

您可以在自定義類中創建多個初始化方法,以允許您的類的使用者以多種方式初始化對象。

如果您有一個類需要應用程序開發人員設置某些屬性,您應該創建一個或多個初始化程序,以便您可以在初始化期間傳遞這些值。這有助於使課程自我記錄。

為了更好地理解初始化器是如何工作的, 譯者 它的目的是將短語從一種語言翻譯成另一種語言(這只是一個模型)。首先創建沒有初始化器的類,然後通過添加帶參數的初始化器來改進類。

下載以按照這些分步說明進行操作 初始化程序演示 一個示例項目來自 這個鏈接.

  1. 打開 初始化程序演示 該項目位於下載的文件夾中。
  1. 右鍵點擊 初始化程序演示 分組並選擇 新文件… 從彈出菜單。
  1. [ファイルの作成]對話框左側 iOS 部分,選擇 資源.
  1. 在對話框的右側, Swift 文件 模板並單擊 下一個.
  1. [ファイルの保存]在對話框中,進行以下更改: 姓名 文檔 翻譯器.swift點擊 創造 添加的按鈕 翻譯器.swift 將文件添加到您的項目中。
  1. 在文件頂部添加以下枚舉聲明。 進口基金會 陳述:

這個枚舉聲明了 Translator 類支持的所有語言。

  1. 然後在枚舉聲明下面添加以下類聲明:

在這個例子中,主要目的是 譯者 類是短語從一種語言到另一種語言的翻譯。 如果不知道“from”和“to”語言,就無法進行翻譯。但是那個 從語言 什麼時候 屬性被標記為可選。從實際的角度來看,它們絕不是一種選擇。

筆記: 您不必將可選屬性顯式設置為 nil,但我這樣做是為了解決 Swift 編譯器中的錯誤!

  1. 讓我們從我們的單元測試中創建這個類的一個實例。這包括 翻譯器.swift 在項目導航器中選擇文件後,轉到文件檢查器(檢查器工具欄左側的第一個按鈕)並單擊 InitializerDemoTests 選中如圖 1 所示的複選框。這使得該類可以從單元測試項目中訪問。
選擇目標成員
圖 1 – InitializerDemoTests 目標成員資格選擇
  1. 在下面 InitializerDemoTests [プロジェクト ナビゲーター]在一組 InitializerDemoTests.swift 文檔。
  1. 將以下測試方法添加到類的右花括號上方的代碼文件底部。

這是一個糟糕的設計,因為開發人員必須自己解決 從語言 什麼時候 屬性應該在 譯者 可以使用對象。

讓我們做出更好的設計。

  1. 返回 譯者 分類並刪除 ? = 無 後部 type 表示這些屬性不是可選的。然後將初始化程序更改為:

此類添加了一個初始化程序 什麼時候 類型參數 .

  1. 根據 命令+B 構建您的項目。您現在應該得到一個編譯器錯誤。要檢查問題的原因, InitializerDemoTests.swift 當我在 Project Navigator 中打開文件時,我收到圖 2 中所示的錯誤。
缺少參數編譯器錯誤
圖 2 – 編譯器錯誤“缺少參數”

錯誤的全文顯示“調用中的參數’來自’沒有參數”。為什麼我會收到此錯誤?

如果你沒有為你的類指定一個自定義的初始化器,Swift 編譯器會在後台添加一個默認的初始化器。因此,嘗試使用此默認初始化程序的單元測試代碼將失敗。

在這個例子中,這正是我們想要的!我們想要強制開發者擁有所需的兩條路徑 創建類實例時的值。現在讓我們更改代碼來執行此操作。

  1. 先把裡面的代碼全部去掉 測試翻譯 方法。然後添加以下代碼:

鍵入左括號後,會彈出代碼完成並提供圖 3 中所示的選項。

自定義初始化程序的代碼完成
圖 3 – 自定義初始化程序的代碼完成

這使開發人員非常清楚他們需要創建什麼。 譯者 班級。

  1. 顯示代碼完成模板(如果它不可見,請單擊 逃脫 再次顯示),按 標籤 搬去 佔位符和類型 英語.根據 標籤 第二步 佔位符和輸入 語言中文然後按右箭頭鍵,Swift 會自動填充右括號。完成後,您的代碼應如下所示:

如您所見,代碼完成將參數名稱插入到方法調用中。這是必需的。省略這些參數名稱將導致編譯器錯誤。

這不是一個單元測試,但我希望它能給你一些調用不同類型初始化程序的經驗。

本地和外部參數名稱

初始化方法的本地和外部參數名稱與常規方法略有不同。

因為初始化器總是被調用 裡面,您不能使用第一個參數的描述來創建初始化程序名稱。因此,Swift 為每個參數提供了一個與本地名稱相同的自動外部名稱來聲明,如圖 3 所示。

要聲明與本地名稱不同的外部名稱,請使用與常規 Swift 方法相同的語法。例如下面的代碼 什麼時候 本地參數名稱:

在此示例中,聲明外部參數名稱會在調用初始化程序時更改參數名稱(參見圖 4)。

新的外部參數名稱
圖 4 – 新的外部參數名稱在起作用

如果您不希望參數具有外部名稱,請在本地參數名稱前加上下劃線。

指定初始化器和便利初始化器

Swift 支持兩種主要類型的初始化器:指定初始化器和便利初始化器。讓我們仔細看看每個,以便您了解如何最好地初始化您的自定義類。

指定初始化器

1 指定初始化器 類的主初始化器。負責初始化類中聲明的所有屬性,並在其超類中調用初始化器(如果有超類)。

例如, 譯者 班級, 初始化: 從: 到: 用於初始化類中聲明的兩個屬性的指定初始化程序。

以下是指定初始化程序的語法。

每個類必須至少有一個指定的初始化器。您可以擁有多個,但更常見的是只有一個。

便利初始化器

1 便利初始化器 二級類初始化器,通常接受的參數少於指定初始化器,但調用指定初始化器為某些參數設置默認值。便利初始化器是可選的,但通常有助於類實例化。

下面是便利構造函數的語法。

讓我們創建便利初始化器,以便我們可以更清楚地了解它們是如何工作的。

  1. 裡面 初始化程序演示 項目,選擇 翻譯器.swift 項目導航器中的文件。
  1. 添加以下新初始化程序 譯者 班級:

以下是一些需要注意的事項:

  • 這個 方便的 關鍵字用於將方法標記為便利初始化程序。
  • 便利初始化器調用同一個類中的指定初始化器,傳遞默認值 英語 將值作為第一個參數傳遞並傳遞自身 將參數指定為第二個參數。
  • 便利的初始化器讓你通過只傳遞一個參數來實例化一個類。例如:

  • 當我實例化該類的一個實例時,代碼完成現在列出了兩個初始化程序,如圖 5 所示。
代碼完成中的多個初始化器
圖 5 – 代碼完成中的多個初始化器

結論是

本文介紹了 Swift 中初始化器的基礎知識。我有很多要學習的。在我的下一篇文章中,我將介紹“初始化器鏈接”、“兩階段初始化”和“初始化器繼承”。敬請關注!