interface是一個類的頭檔案的聲明不是真正意義上的接口的意思。protocol才是oc的接口。
作用:
文法格式:
類遵守協定
一個類可以遵守1個或多個協定
任何類隻要遵守了protocol,就相當于擁有了protocol的所有方法聲明
protocol和繼承的差別:
繼承之後預設就有實作, 而protocol隻有聲明沒有實作
相同類型的類可以使用繼承, 但是不同類型的類隻能使用protocol
protocol可以用于存儲方法的聲明, 可以将多個類中共同的方法抽取出來, 以後讓這些類遵守協定即可
協定的注意事項:
protocol可以實作一些必須實作和選擇實作的方法。這個和java是完全不同的。
@required和@optional關鍵字
協定中有2個關鍵字可以控制方法是否要實作(預設是@required,在大多數情況下,用途在于程式員之間的交流)
@required:這個方法必須要實作(若不實作,編譯器會發出警告)
@optional:這個方法不一定要實作
協定的類型限制
1、協定的第一個應用場景,可以将協定寫在資料類型的右邊,明确的标注如果想給該變量指派,那麼該對象必須遵守某個協定。
2、注意:類型限定是寫在資料類型的右邊的。(有點類似java中的範型)。
3、雖然在接受一個對象的時候,對這個對象進行了類型限定(限定它必須實作某個協定),但并不意味着這個對象就真正的實作了該方法,是以每次在調用對象的協定方式應該進行一次驗證。
可以使用"respondstoselector:@selector(方法名)"對 這個遵循協定的對象的方法在被調用的時候進行安全驗證 例如:
wife這個類遵循了一個協定,并實作了需要的方法,然後在person類中有一個wife對象屬性,并在person自己的方法中調用wife的屬性[self.wife cooking],這裡就需要驗證wife的方法是否實作了協定的方法。(看下面的代碼)
這麼做也是用于程式員之間溝通的。這樣可以使得第二個個程式員和第一個程式員開發的代碼在協定上很好的發現需要遵循協定并需要實作的地方。
4、遵守協定,僅僅是具有協定中方法的聲明,但是沒有方法的實作,所有還需要具體的實作。
協定的編寫規範: 1.一般情況下, 目前協定屬于誰, 我們就将協定定義到誰的頭檔案中 2.協定的名稱一般以它屬于的那個類的類名開頭, 後面跟上protocol或者delegate 3.協定中的方法名稱一般以協定的名稱protocol之前的作為開頭 4.一般情況下協定中的方法會将觸發該協定的對象傳遞出去
5.一般情況下一個類中的代理屬于的名稱叫做 delegate
6.當某一個類要成為另外一個類的代理的時候, 一般情況下在.h中用@protocol 協定名稱;告訴目前類 這是一個協定. 在.m中用#import真正的導入一個協定的聲明