Protocol in Objective-C

Protocol 在 Objective-C 裡面,是定義列出一系列 method ,讓任何 class 想要接上這個 protocol 的 class 並且實作它們,但是 protocol 不能新增 instance variable。宣告時候想引用多個 protocol,寫法上是 < protocol1, protocol2 > 。

我們來看放在 UITableView.h 裡面的 UITableViewDataSource :

@protocol UITableViewDataSource

他可以在 method 清單裡面,規劃不同區域出來 @required 和 @optional,最後以 @end 作為結尾。顧名思義 required 的 method 在 implement 上都要實作,而在 optional 區域裡面,可實作可不實
。所以這樣在呼叫的這方,在呼叫到一個 optional 的 method 前,記得要加上判斷,不然在未判斷以前,呼叫執行進去,即會發生 exception。若要檢查物件是否有實作 protocol 定義,,用 conformsToProtocol 判斷,寫法如下:


它很像 Java 的 Interface,定義出 method,並且讓想要使用的 class 來 implement,但是開發上又不太一樣。Protocol 在 iOS 開發上,主要用於 Delegate。反觀 Java 的 Interface,單一個 Java implement class 可以 implement 多個 interface 檔案,但是都必須要去實作它們。無法像 Objective-C 這樣給與 optional 不強制一定要實作完成。

Protocol 可以拿來當一般的型別使用,例如:

id myBook;

這意思說 myBook 必須是要實作 Document 這個 protocol 的物件,才能接收進來。也讓 Compiler 可以事先做型別檢查。

另外這邊以另外一個例子:

@interface Document

意思是,Document 這個 class interface 加入了 Document protocol。然後今天我們要寫一個 Method 可以做到加入文件,如果說這個 method 最後要判定是否加入文件成功,我們也希望傳進來的是有加入 Document protocol 的,在寫法上可以加入這些判斷:


所以碰到傳進來是要 protocol,且要判定測試它是否有此 protocol,用 conformsToProtocol 判斷。

另外回來看 header 檔案的 interface,定義上算是這樣同樣命名的一組 (*.h, *.m ) 的介面,但是它裡面可以配製 variables,和定義 methods。 再由 implement class 來實作該 header 檔案。而在 extend 方面,都是交由 header 來處理,而 implement 檔案部份只要實作就好,規劃出物件導向設計。

以上如此看來 Objective-C 的 Protocol, Interface, Implement 和 Java 的 Interface, Implement 在設計開發上,即可瞭解雙方的不同。

Comments