我們之前講過非正式協議(nsobject的類目),那麼肯定還有正式協議。在oc中,乙個類可以實現多個協議,通過協議可以彌補單繼承的缺陷。但是協議跟繼承不一樣,協議只是乙個方法的列表,方法的實現得靠遵循該協議的類去完成。
**協議:協議是一套標準,這個標準裡面宣告了很多方法,但是不關心具體這些方法是怎麼實現的,具體的實現是由遵循這個協議的類去完成的。**
和非正式協議一樣,正式協議是一些方法的列表,合肥正式協議不同的是,採用正式協議需要在宣告類的時候說明要採用的協議。使用協議的辦法是在類的@inte***ce宣告中列出協議的名稱。這時,這個類就遵循了協議的內容,採用協議的話,就要讓這個類實現該協議裡所宣告的方法。否則,編譯器就會發出警告。
下面通過乙個例子類說明協議的用法。
建立乙個 student 類和 waiter 類,在 student 類中宣告乙個協議,該協議包含乙個方法-(void) sendfood:(bool)flag;
,讓 waiter 類遵循該協議。
//協議 正式協議
//定義乙個協議
@protocol
foodprotocol
/* 在方法宣告的時候,可以有兩個關鍵字去限制是否讓遵循該協議的類去實現此方法
@required 標註的方法為必須實現的方法(預設)
@option 標註的方法為可選實現的
*/@optional
- (void)sayhello;
@required
- (void)sendfood:(bool)flag;
@end
@inte***ce
student : nsobject
@property (nonatomic,assign)bool flag;//學生狀態,忙或者不忙
//宣告了乙個必須實現協議的物件,使用assign或者weak,為了防止迴圈引用
@property (nonatomic,assign)id
delegate;//宣告了乙個遵循foodprotocol協議的**
@end
student.m檔案
@implementation
student
- (void)setflag:(bool)flag
else
waiter類遵循該協議
//去.m檔案實現協議裡的方法 表示遵循協議
@inte***ce
waiter : nsobject
waiter.m檔案
@implementation
waiter
//哪個類遵循協議就由哪個類去實現協議裡的方法
- (void)sendfood:(bool)flag
else
}
主函式中
student *student = [student new];
waiter *waiter = [waiter new];
student.delegate = waiter;
student.flag = yes;
執行結果為
2016-08-17 12:13
:31.808
oc_09_02
[1262:79013] 學生忙,我給你送外賣
還可以有另外一種宣告協議的方式,即新建乙個.h協議檔案
#import
//只是乙個協議,不關心哪個類去實現
@protocol
foodprotocolsecond
@end
OC學習 protocol的使用
protocol 協議 可以用來宣告一堆的方法。protocol 協議名稱 方法的宣告列表 end 例如 protocol mydogprotocol void dogtest end 1 乙個類遵守協議 inte ce 類名 父類名 協議名稱1,協議名稱2,end 例如 inte ce hashi...
Protocol (協議中的構造器)
import uikit class viewcontroller uiviewcontroller 用作俠客的協議,凡是俠客,都應該有一把 protocol knighterrant class disiple knighterrant 協議中的構造器方法在遵循類中被實現為指定構造器 requir...
swift 中協議的使用 protocol
協議可被類 結構體 或列舉型別採納以提供所需功能的具體實現。滿足了協議中需求的任意型別都叫做遵循了該協議。實現目標,以官方文件為背景,修改了一下,使其更簡單,建立乙個遊戲玩家和遊戲狀態跟蹤的類,將遊戲和開始和結束做為遊戲狀態。protocol gameprotocol func gamestart ...