OC中的協定就相當于Java中的接口,那個類實作了這個協定就必須實作協定裡面的方法。
以下為一個執行個體:
Student.h 的代碼檔案如下:
#import <Foundation/Foundation.h>
@protocol StudentProtocol <NSObject>
//必須實作的方法,不寫時預設
@required
- (void)sayHi;
//可選擇的方法
@optional
- (void)sayHello;
@end
@interface Student : NSObject <StudentProtocol>
@end
Student.m 的代碼檔案如下:
#import "Student.h"
@implementation Student
- (void)sayHi {
NSLog(@"%s",__FUNCTION_);
}
@end
main.m 的代碼檔案如下:
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student *stu = [[Student alloc] init];
[stu sayHi];
}
return ;
}
測試結果如下:
-08- :: Demo01[:] -[Student sayHi]
當然,協定裡也不能定義屬性,當可以使用@property聲明setter和getter方法,詳情請參考我的OC循環漸進:類目和延展中的【模拟延展屬性】和OC循環漸進:模拟實作多繼承的兩種方式中的【協定模拟多繼承】。