iOS之協(xié)議

一 : 簡述

在OC中協(xié)議-protocol,協(xié)議就是是一方法的聲明,這些方法可以有選擇實現(xiàn)與必須要實現(xiàn)的.

二 : 協(xié)議的定義

@protocol協(xié)議名稱

// 方法聲明列表

@end

示例

創(chuàng)建了一個協(xié)議,其中有一個必須實現(xiàn)的方法study

.h
@protocolStudyProtocol
- (void)study;
@end

三 : 遵守協(xié)議

有了協(xié)議,那么如何使用這個協(xié)議呢,讓類遵守協(xié)議

@interface類名 : 父類 <協(xié)議名稱1, 協(xié)議名稱2,…>@end

OC是單繼承,但是一個類可以遵守一個或多個協(xié)議

@interfacePerson:NSObject
@end
@implementationStudent
// 實現(xiàn)協(xié)議方法
-(void)EatSomting{NSLog(@"%s", __func__);}
// 實現(xiàn)協(xié)議方法
-(void)study{NSLog(@"%s", __func__);}
@end

協(xié)議和繼承的區(qū)別:

1.繼承之后默認(rèn)就有實現(xiàn), 而protocol只有聲明沒有實現(xiàn)
2.相同類型的類可以使用繼承, 但是不同類型的類只能使用protocol
3.protocol可以用于存儲方法的聲明, 可以將多個類中共同的方法抽取出來, 以后讓這些類遵守協(xié)議即可

四 : 協(xié)議的使用特點

1.父類遵守了某個協(xié)議,那么子類也自動遵守此協(xié)議
2.父類遵守了此協(xié)議

@interfacePerson:NSObject
@end

子類自然遵守此協(xié)議

.h
@interfaceStudent:Person
@end
.m
@implementationSutdent
-(void)study{    }
@end

協(xié)議可以遵守協(xié)議

一個協(xié)議遵守了另一個協(xié)議,就可以擁有另一份協(xié)議中的方法聲明

@protocolA
-(void)methodA;
@end
@protocolB
-(void)methodB;
@end
@interfaceTZperson:NSObject
-(void)methodA;// 同時擁有A/B協(xié)議中的方法聲明
-(void)methodB;
@end

基協(xié)議
每個協(xié)議都應(yīng)該遵守NSObject協(xié)議,它是一個基協(xié)議,最根本的協(xié)議.

@protocolA// 基協(xié)議-(void)methodA;
@end

required 與 optional關(guān)鍵字

required: 方法必須要實現(xiàn),不實現(xiàn)則編譯器會發(fā)出警告

optional: 方法不一定要實現(xiàn)

用于開發(fā)者之間的交流

如果沒有使用任何關(guān)鍵字修飾協(xié)議中的方法,那么該方法默認(rèn)就是required的,關(guān)鍵字并不能嚴(yán)格的控制某一個遵守該協(xié)議的類必須要實現(xiàn)該方法, 因為即便不是實現(xiàn)也不會報錯, 只會報一個警告

@protocolA

@required

-(void)methodA;

@optional

-(void)methodA;

@end

五 : 類型限定

定義協(xié)議

@protocolgirlGod

@required

-(void)beatuiful;

@optional

-(void)sexy;

@end

要求某些對象具備上述協(xié)議行為,可以將協(xié)議寫在數(shù)據(jù)類型的右邊,明確的標(biāo)注如果想給該變量賦值,那么該對象必須遵守某個協(xié)議

id girl = [girl new];
格式 : 數(shù)據(jù)類型<協(xié)議名稱> 變量名,和泛型是一個寫法

六 : respondsToSelector

當(dāng)某個類遵守了某個協(xié)議,但并意味著,它就一定要實現(xiàn)它,因為不實現(xiàn)也不報錯.當(dāng)這個類被實例化,意味著可以調(diào)用其遵守的協(xié)議方法,但如果沒有實現(xiàn)就會報錯,所以要使用respondsToSelector進(jìn)行判斷是否實現(xiàn)了某些協(xié)議方法

@protocolwiftPro

-(void)dohouseWork;

-(void)papapa;

@end
@interfacewife:NSObject

if([self.wift respondsToSelector:@selector(dohouseWork)]) 
{  
    [self.wift papapa]; 
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容