iT邦幫忙

1

Swift - 協議導向程式語言(Protocol-Oriented Programming, POP)

  • 分享至 

  • xImage
  •  

前幾個月換了新 mac,這幾天終於有時間裝 Xcode 來玩看看 Swift 了!
學習筆記
在學習Swift時,看到官方說這是門: 協議導向程式語言(Protocol-Oriented Programming,POP)

OOP我瞭解,POP還是第一次看到,所以我整理了一下,希望如果有人不了解,可以看了這篇文後就馬上理解Swift的開發哲學!


1. 傳統的痛點:階層式繼承(Is-A 關係)

在傳統的物件導向語言(如 Java 或舊式的 C++)中,如果想要讓不同的類別擁有共同的功能,通常會使用 「繼承(Inheritance)」

繼承強調整個家族樹(例如:鴨子 繼承自 鳥類鳥類 繼承自 動物)。但如果今天有一隻「機器鴨」,它會飛、會叫,但它不是動物,它該怎麼辦?如果硬要繼承,程式碼就會變得非常僵化、肥大(這就是著名的「金字塔地獄」)。


2. Swift:Protocol 組合(Can-Do 關係)

Swift 的做法是:不要去管它「是什麼(Is-A)」,而是去管它「會什麼(Can-Do)」。

Protocol(協議) 就像是一張合約,你可以定義好幾個獨立的小能力:

  • Flyable(會飛的)
  • Swimmable(會游水的)
  • Runnable(會跑步的)

當你要打造一個角色(例如一隻「鴨子」結構)時,不需要繼承誰,只需要讓它同時**遵守(Conform)**多個 Protocol,就能讓它集多種能力於一身:

// 協議本體:只能規定有這個功能,不能寫實作內容
protocol Flyable {
    func fly()
}

protocol Swimmable {
    func swim()
}

// 建立一個結構,同時「組合」多種能力
struct Duck: Flyable, Swimmable {
    func fly() {
        print("鴨子在飛")
    }
    
    func swim() {
        print("鴨子在水裡游")
    }
}


3. Protocol:實作(Protocol Extensions)

不過在 Swift 中,純粹的 Protocol 裡面並不能寫實作程式碼,所以 Swift 允許我們透過 extension(擴充) 來為 Protocol 寫入預設的程式碼邏輯。

假設你寫了一個 Flyable 協議,並加上一段預設實作:

// 協議擴充:在這裡可以寫程式碼,提供預設的飛行動作
extension Flyable {
    func fly() {
        print("正在空中飛行!") // 這裡可以寫具體的程式碼
    }
}

一般 Protocol 不能寫實作,能拿來做啥?

雖然「純定義的 Protocol」裡面不能寫半行程式碼,扮演著 「規格書」與「介面(Interface)」 的角色,但如果沒有這種純粹的規範,我們很難寫出具有高擴充性的大型 App。它的三大核心用處為:

  1. 多型(Polymorphism)
    允許你把完全不同結構的型別(例如 Bird 和 Airplane)放進同一個陣列中統一管理。
    如此一來呼叫端不用管眼前這個東西細節是什麼,只要知道它「符合這個 Protocol(具備這項能力)」就能直接指揮它做事。

  2. 模組解耦與依賴反轉(Decoupling)
    讓不同的畫面或功能模組能夠安全地互相溝通,卻又不會「綁死彼此」,比如說購物車畫面不需要知道是哪一個主頁面來接收結帳結果,它只要求「只要來接的人符合這個 Protocol 就可以了」。這讓程式碼抽換與單元測試變得非常輕鬆。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言