iT邦幫忙

0

iOS APP 開發 OC 第二十二天,Portocol

tags: OC 30 day

什麼是Protocol?

作用:專門用來聲明一大堆方法。(不能聲明屬性,也不能實現方法,只能用來寫方法的聲明)。只要某個類遵守了這個portocol。就相當於擁有這個portocol中的所有的方法聲明。
如上圖,只要某個類遵守了這個portocol,就相當於擁有了這個portocol的所以方法聲明,而不用自己去定義。

portocol 聲明

@protocol portocol名稱 <NSObject>

methods聲明

@end

新增一個portocol的方式。NewFile OC-File-protoco portocol的文件名: .h 並且只有一個 .h 文件。

在portocol的文件中,只能用來聲明方法,portocol的作用:就是專門用來寫方法聲明的。

類遵守portocol

portocol是用寫方法聲明的,就是用來被類遵守的。

如果想要讓一個類,擁有portocol中定義的所有的方法聲明,那麼就讓這個類遵守這個portocol。
類只要遵守一個portocol,那麼這個類就擁有了這些portocol中定義的所以的方法的聲明了。

這個類只是擁有了這個portocol中的方法聲明爾以。沒有實現。所以這個類,就應該匙實現portocol中的方法。

類是單繼承,但是portocol可以多個遵守

一個類只能有一個父類
但是一個類可以同時遵守多個portocol。

@interface 類名:父類名 <protocol1,portocol2>
@end

當一個類遵守了多個portocol之後,就相當於這個類擁有了所有portocol中定義的方法聲明。那麼這個類,就應該實現所有portocol中的方法。

如果不實現,其實也不會報錯,編譯器只是會報警告。
但是當創建對象,來調用這個沒有實現的portocol中的方法的時候,就會報錯。

當一個類遵循portocol時,有的只有方法的聲明,沒有實現。要類自己去實現。

當一個類遵守了多個portocol之後,就相當於這個類擁有了所有portocol中定義的方法聲明。但是僅僅只是有方法的聲明而已,沒有實現,要類自己去實現。

如果不實現,其實也不會報錯,編譯器只是會報警告。
但是當創建對象,來調用這個沒有實現的portocol中的方法的時候,就會報錯。

當一個類遵守了多個portocol之後,就相當於這個類擁有了所有portocol中定義的方法聲明。也不會報錯,只是給一個警告。

@requird 與 @optional

這兩個修飾符是專門用來修飾portocol的方法。

@requird

在portocol中,如果方法的聲明被@required修飾,那麼遵守這個portocol的類必須要實現這個方法,否則編譯器會發出警告。

@optional

在portocol中,如果方法的聲明被@optional修飾,那麼遵守這個portocol的類可以實現這個方法,也可以不實現這個方法,不實現編譯器也不會發出警告。

其實,無論是@required還是@optional你都可以不實現。編譯器是不會報錯的,仍然可以編譯執行。唯一的區別是:當遵守portocol的類不實現portocol中的方法時,@required會給一個警告,@optional沒有。
這兩個關鍵字的主要作用在於:工程師的溝通,告訴遵守portocol的類,哪些方法必須要實現,因為這些方法我會調用。

默認的狀態為 @required

portocol 與 portocol 之間可以相互繼承

繼承的語法:

@portocol 名稱 <父portocol>
@end

效果:子portocol不但有自己的方法聲明,還有父portocol中的所有方法聲明。

NSObject

在Foundation框架中,有一個類叫做NSObject是所有OC類的基類。
在Foundation框架中,有一個Portocol,叫做NSObject

NSObject portocol 都被 NSObject 類遵守,所以NSObject portocol中的所有方法全部的OC類都有了,這麼說。所有的OC類都遵守了NSObject portocol。NSObject portocol叫做基協議

類的名稱可以跟portocol的名稱一致。

寫Portocol的規範

要求所有的portocol都必須要直接或是間接的從NSObject基協議繼承。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言