有關於iOS底下的Protocol

 

請參照至其版大的文章

Protocol in Objective-C

http://blog.eddie.com.tw/2010/12/11/protocol-in-objective-c/

這版大實在寫的思路很清晰,推薦一下摟

(看來我還是要多多拜讀別人的文章才是)

------------------------------------------------------------------------------------------------

為了響應不全文引用,以下採用節錄的,完整內容請移至版大的文章

 

Objective-C是單一繼承的,如果想要做到一個類別同時擁有多種型別的能力,可以透過實作其它型別的interface來達成這個目的。在Java/AS3是用”interface”這個關鍵字,在Objective-C則是用”@protocol”。

(有寫過Java/AS3的要特別注意不要把interface跟protocol搞混了
,在Objective-C的interface等於Java/AS3的class,而protocol則是相當於interface)

Johnny: 關於protocol這點,我也常常搞混.....= =||


如果你要新增一個自定的protocol的話,可以直接在你的專案裡新增一個protocol檔:

image

新增完成之後(它是一個header檔),就可以開始來寫了,

---------------------------------------------------------------------------------------------------

程式碼如下:

@protocol Drawable

@required
-(void) draw;
-(void) changeColor;

@optional
-(void) whateverMethod;

@end

在上面這段程式碼裡,我放了三個方法,但沒有寫內容。接下來如果我要實作自這個protocol的話,所有定義在@protocol裡的方法都得實作出來。

如果沒特別標明的,預設是@required。如果你要實作這個protocol的話,照英文字面來看,@required的部份是規定要實作的,@optional的話就隨你高興了。要注意的是@required跟@optional這兩個語法的影響範圍,是從它以下所有的method都會被影響,直到另一個directive或是@end為止


-------------------------------------------------------------------------------------------------------------------------

實作protocol的方法就是用”<>”標記,裡面放protocol的名稱。並不限定只能實作一個protocol,如果要實作多個protocol的話,則是用逗點分開

因為在protocol的地方已經有定義好了方法,所以在@interface的地方就不用再特別寫一次,只要在@implementation裡補上該實作的方法就行了。

// --------------

// interface
// --------------
#import <Cocoa/Cocoa.h>
#import "Drawable.h"

@interface Book : NSObject <Drawable>
{
int price;
}
@property int price;

@end

// --------------
// implementation
// --------------
#import "Book.h"
@implementation Book

@synthesize price;

// 實作方法draw
-(void) draw
{
NSLog(@"draw me!");
}

// 實作方法changeColor
-(void) changeColor
{
NSLog(@"change color!");
}

@end

 

-------------------------------------------------------------------------------------------------------------------------

Johnny: 簡單來講,protocol就是Java裡的介面(Interface),上面開出來的方法(method)
且有@required字樣的都要被實作(implementation)

protocol名稱加綴在類別(class)後面
只是為了要讓Complier,確實的去檢查,開出來的方法

是有都通通有實作完畢

實驗發現,某些Class對於protocol要求沒那麼嚴苛

只要實作出它要的方法,而不用加掛這個綴字

而且避免混淆,我現在習慣通通都加上去

(包含放在Class名稱之後的 < > ,和其protocol要的方法一起宣告在header檔)

 

 

我還是覺得還是要學Java一樣,嚴謹一點比較好,較不會出錯

創作者介紹

清新下午茶

Johnny 鋼鍊 發表在 痞客邦 PIXNET 留言(0) 人氣()