深入了解 Swift 中的協議:為何它們對現代程式設計如此重要?


摘要

深入了解 Swift 中的協議不僅有助於提升程式設計技巧,也讓我們在當今快速變化的技術環境中保持競爭力。 歸納要點:

  • Swift 協議是面向協議程式設計 (POP) 的基礎,促進代碼重用和靈活性,使開發更具可擴展性。
  • 協議擴展提供默認實現,搭配動態調度功能,使得運行時類型檢查和代碼重用更為高效。
  • 結合泛型使用的協議能進一步提升代碼的靈活性與可重用性,適用於多種實際應用場景。
總體而言,Swift 協議的運用對於現代軟體開發至關重要,它們不僅提高了代碼質量,還增強了項目的可維護性。

它是什麼以及它的運作方式 - 閱讀後,請儲存此頁面!


職場文化差異:如何理解『這不是我們在這裡做事的方式』

這不是我們在這裡做事的方式。這句話或許是我聽過最令人惱怒的話,而更糟糕的是,所謂的「事情」居然是午餐。我當時正在和一個新團隊合作,到了午餐時間,我建議了去吃飯的地方。令我驚訝的是,一位同事立即告訴我,我的建議並不是他們辦公室裡的午餐慣例。我對該如何回應感到不太確定,畢竟我是新來的,因此當另一位同事替我回答道:「您剛才說的,就是我們在這裡做事的方法嗎?」時,我心中鬆了一口氣。

於是,我把決定權留給了那兩位男士,以確定辦公室午餐的規範。根據劍橋詞典,「協議」(protocol)是一套用於官方儀式和場閤中的規則及可接受行為系統。例如,在英國,皇家婚禮協議就列出了涉及英國皇室成員婚禮所需遵循的傳統、習俗和正式規則。在這樣多元文化交融且日益全球化的職場環境中,「這不是我們在這裡做事的方法」所隱含的不僅僅是單純的一句話,它還反映出不同文化背景下對於工作生活方式和社互動動模式各異的重要性。

**專案1:職場文化的多樣性與包容性**:近年來,隨著全球化與多元文化交流加深,職場文化也顯得愈加多元。因此,在遇到「That’s not how we do things around here」這種情況時,我們必須理解背後潛藏著哪些文化脈絡,以免陷入刻板印象或偏見之中。例如,有些文化重視團隊合作及凝聚力,使得午餐成為一種社交儀式;而另一些文化則更加注重個人選擇。因此,以開放包容的心態去理解不同文化中的職場規範並主動尋求溝通與協商,是達成彼此都能接受方案的重要步驟。

**專案2:新員工融入職場的策略**:對於剛加入團隊的新員工而言,融入團隊文化至關重要。在面對「That’s not how we do things around here」這種情況時,保持積極態度、樂於學習及適應變化尤其重要。除了了解既有團隊規範外,新員工還可主動提出建議及參加團隊活動,以展現積極性及融入意願。同時,也可以透過觀察、詢問資深同事或直接向主管請教,更深入地了解團隊文化與工作流程,使自己更好地融入其中。

皇家婚禮:傳統與現代的完美平衡

皇家婚禮的禮儀旨在保持傳統與皇室的莊嚴,同時確保婚禮具備尊嚴和象徵意義。還涉及外交禮節。外交禮節是指正式規範、習俗和禮儀,用於規範外交官、國家元首及政府官員之間的互動,特別是在國際關係中。這些規範確保了各國及其代表之間的尊重、禮貌和良好關係。換句話說,這種協議回答了「它如何運作?」這一問題——透過列出事件或關係(如皇家婚禮、外交關係甚至辦公室午餐)必須遵守的規則和條例。

在 Swift 中,就像在現實生活中一樣,協議定義了符合標準型別所需實現的方法、屬性以及其他要求,以滿足管理其狀態和行為所需遵循的規則。

**現代化與傳統的平衡:** 近年來,皇家婚禮的儀式正經歷微妙變革,以適應當今社會需求。雖然傳統依然重要,但現代元素日益顯著。例如,凱特王妃和梅根王妃的婚禮均展現了當代社會多元文化與個人風格。她們選擇了非傳統婚紗設計、獨特婚宴地點及音樂,同時也保留了皇室婚禮所需的莊重與隆重。這反映出皇家婚禮不僅要維護傳統,也需要回應社會變遷,以保持與大眾之間的聯絡。因此,在新舊交替中尋找平衡,是當今皇家慶典的重要課題之一。

皇家婚禮禮服協議:打造完美婚紗的守則

那麼,回到我們的皇家婚禮類比,一個定義新娘禮服規則的 Swift 協議可能包含以下條件:

- 必須獲得國王的祝福
- 領口必須保守——不得露出胸部
- 必須有袖子——裸露的手臂不得顯現
- 必須由英國設計師創作
- 顏色必須是白色——米白色不行

這個協議可以被建立皇家婚禮禮服的類別、結構或列舉所採用,而該物件必須提供實際實現。當 RoyalWeddingDress 物件滿足 RoyalWeddingDressProtocol 的要求時,就被認為符合該協議。

讓我們來看看這一切是如何運作的!

 protocol RoyalWeddingDressProtocol {          var isBlessedByKing: Bool { get }     var hasSleeves: Bool { get set}     var isWhite: Bool { get set }     func conservativeNeckline()     func createdBy() }   class RoyalWeddingDress: RoyalWeddingDressProtocol {          var isBlessedByKing = true     var hasSleeves = true     var isWhite = true          func conservativeNeckline() {         print("This Royal wedding dress has a conservative neckline, the King will approve!")     }          func createdBy() {         print("Alexander McQueen is the designer.")     } }  let myRoyalWeddingDress = RoyalWeddingDress()  myRoyalWeddingDress.isBlessedByKing // true myRoyalWeddingDress.hasSleeves // true myRoyalWeddingDress.isWhite // true myRoyalWeddingDress.conservativeNeckline() // This Royal wedding dress has a conservative neckline, the King will approve! myRoyalWeddingDress.createdBy() // Alexander McQueen is the designer. 

這段程式碼首先定義了一個皇家婚紗的協議,該協議規定了英國皇室新娘在結婚當天必須滿足的條件。協議並不負責指定功能的作用或屬性是要儲存還是計算。協議僅要求定義的屬性和函式的名稱及型別。實際的實現則由採用該協議的型別來完成—在本教程中稱為採用型別。

 class RoyalWeddingDress: RoyalWeddingDressProtocol {

協議:程式碼的契約,賦予靈活與嚴謹

在這裡,類別 `RoyalWeddingDress` 採用了 `RoyalWeddingDressProtocol`,而這件裙子的實作則寫在類別的主體內。當一個物件採用某個協議時,它必須包含該協議的所有要求,例如任何定義的屬性或函式。如果未能遵守,將會導致錯誤。由於協議並不關心採用型別如何實作屬性和函式,因此 `RoyalWeddingDress` 類別的屬性可以輕易地從 true 切換為 false,而函式則可以列印不同的訊息或執行完全不同的操作,該類別仍然能滿足 `RoyalWeddingDressProtocol`,僅因為已經實作了命名的屬性和函式。

換句話說,協議提供了一個實作藍圖,而採用該協議的型別決定如何滿足這些要求。這種契約關係讓開發者可以建立一個標準,以確保所有採用此協議的類別都符合相同要求,在大型專案中尤為重要,有助於維護一致性、簡化管理,以及提高可讀性與可維護性。因此,《紐約時報》和《經濟學人》所強調的是,協議不僅是介面的簡單定義,更是一種強制性的契約關係,使得開發者能夠建立出一個嚴謹且可預期的程式設計環境。

同時,協議還展現出其靈活性,其角色僅限於提供藍圖,不幹擾各類別如何具體實現這些要求。這種靈活性意味著,各類別可以自由選擇如何執行協議中的屬性及方法,也使得協議在物件導向程式設計中具有極高的可擴充套件性。在 Swift 等現代程式語言中,隨著函式式程式設計思想融入,使用者愈來愈多地透過定義函式型態(例如:`func (Int, String) -> Int`)來利用協議進行函式傳遞和組合。

需要注意的是,即便有如此多優點,但也存在一些限制。例如,一旦某個物件無法完全遵循其所採用之協議規範,它可能產生不可預見的問題。因此,在使用時需謹慎考量,以確保整體架構的一致與穩健。」

 let myRoyalWeddingDress = RoyalWeddingDress()

面向協議程式設計:以皇家婚禮禮服為例,探討 POP 在軟體開發中的應用與優勢

RoyalWeddingDress 被初始化,並將例項賦值給常數 myRoyalWeddingDress。RoyalWeddingDress 類別遵循 RoyalWeddingDressProtocol 的目的是確保它滿足一件皇家婚禮新娘禮服的基本要求。當然,這個類別可以做任何其他事情,它可以在腰部附上羽毛,或在下擺上串珠,只要滿足 RoyalWeddingDressProtocol 的條件就無所謂。

但是,如果某個例項決定將 isWhite 屬性改為 false,使得這件禮服不再是白色,那該怎麼辦呢?簡單的答案是協議並不在乎。對於協議而言,重要的是 RoyalWeddingDress 符合其定義中設定的條件。採用此協議的型別始終完全控制如何實現協議的要求。

值得注意的是,面向協議程式設計(Protocol-Oriented Programming, POP)正在成為軟體開發領域中的新趨勢,它透過定義和遵循協議來實現程式碼的解耦與靈活性,而這正與上述提到的 RoyalWeddingDressProtocol 概念相契合。例如,在 ROYALWEDDINGDRESS 類別中,我們能夠根據不同場景新增新的功能,而無需改變其核心功能:

- 可以新增一個 `isCustomizable` 屬性,以允許使用者選擇是否進行個性化定製。
- 也可以引入 `RoyalWeddingDressDecorator` 類別,為 RoyalWeddingDress 增加新的裝飾,如蕾絲、刺繡等。

軟體工程師、物件導向程式設計師及設計模式研究者都會對 POP 的應用場景及其優勢感興趣。在大型專案和快速迭代開發中,POP 使我們能夠靈活地擴充套件和修改類而不影響底層實現,因此它在當今技術環境中顯得尤為重要。

Swift 協議:屬性和方法的細節

因此,在 myRoyalWeddingDress 的情況下,屬性 isWhite 可以變更為 false,而例項仍然符合協議的要求。當一個協議要求某個屬性時,必須明確說明該屬性是否可讀取(gettable)或可讀取且可設定(gettable and settable)。可讀取且可設定的屬性不能被分配給常數儲存屬性或只讀計算屬性。只有可讀取的屬性可以在 Swift 的自由裁量之下是可設定的,並且它們可以被分配給任何型別的屬性。所有屬性都應以變數形式宣告。要表示一個既可讀取又可設定的屬性,可以在其型別宣告後寫上 { get set };而要表示僅為可讀取的屬性,則在其型別宣告後寫上 { get }。

方法的宣告方式與普通例項和型別方法相同,但不包含大括號或方法主體。

希望現在你對 Swift 協議有了更深入的了解以及它們如何運作。我鼓勵你開啟一個 playground,把這個教程中使用過的程式碼複製到裡面。在與程式碼互動時,你會更好地掌握這些概念。

祝你程式設計愉快!恭喜你閱讀完這篇文章。你已經超越了99%在中途分心的人。如果想要持續保持成功的勢頭,請關注並訂閱,以便在我發布新內容時第一時間收到電子郵件通知!


MG

專家

相關討論

❖ 相關專欄