也許是因為 protocol 很難用文字讓人體會它的設計理念,很多文件都對它講的不是很清楚,但Protocol 協定與 Delegate 委託(也稱做代理或委派)是 Objective-C 中很重要的一部份。但對於初寫程式的人來說,這是物件導向中,最難理解與使用的一部份,大部份的人要實作數個月後,才能開始體會與實用。不論如何,先記住它的語法與使用法好了。


由於 Objective-C 只支援單繼承,對於繼承自不同父Class 的 Class 來說,如果需要有共同的方法名稱,就需要使用 Protocol,但 Protocol 本身並不會寫方法的實作,只會作方法的宣告。實作的部份,要 Class 自已來作。所以Protocol 的動作其實是非常簡單的。如果我們在 XCode 中新增一個 Protocol 也只會有一個 .h 檔不會有 .m 檔。

Protocol 的語法如下:

 

@protocol protocolName <NSObject>

 method 宣告

@end

 

對,基本上這樣,portocol 本身的程式就結束了,一個典型的範例如下:


@protocol myProtocol <NSObject>

-(void)myMethod1;

@end


要注意的是 Objective-C 中,就像 Class 一樣,所有的 protocol 都應採用另一個協議,但不像 Class 會繼承很多不同的 Class,所以通常大多數的protocol 都會採用 <NSObject> 這個根 protocol


我們會有一些必要的方法與非必要的選擇性方法,我們就可以再加些修飾:


@protocol myProtocol <NSObject>

    @required

-(void)myMethod1;

    @optional

-(void)myMethod2;

@end


這段程式表式 myMethod1 是必要的,而 myMethod2 是選擇性的。但這只是宣告的意圖而已,一個 Class 如果採用了一個 protocol 而沒有實作 required 方法,仍是可以(出現警告)編譯的,而沒有實作 optional 方法而呼叫了這個方法,仍會產生錯誤。

而一個 Class 如果要採用這個方法,只要在@interface 宣告最後加入 <protocol名稱>,就可以了,如果有一個以上的,就用逗別分開如 <protocol1,protocol2> 等。例如一個叫 car 的 class 要採用 myPortocol 就要寫成類似下面這個樣子:
 

@interface car:NSObject<myProtocol>


最後實作方法就可以了。

各位看到這兒,可能會覺的 Protocol 只是一堆方法的宣告,其實際的意義非常簡單,但也可能不太了解為何要有如此動作,但在 iOS 開發當中,這是非常重要的理念。

在實作開發中,protocol 是非常廣泛的用在 iOS 的開發上,特別是用在 delegate 委託機制上,可能要看懂 delegate 後,才能夠體會 protocol 的設計理念。

  

arrow
arrow

    shenfive 發表在 痞客邦 留言(1) 人氣()