2009-07-09 36 views
10

我正在學習Objective-C,並在協議中遇到了可選方法。我的背景是C#,並且可以將協議看作與C#接口類似的東西。@optional協議方法的真實世界示例

凡C#接口代表一個合同,通過廣告接口,你說你會實現定義的方法。

考慮到這一點,我很困惑爲什麼你需要定義一個可選的方法。這不是誹謗或企圖減少Objective-C,我愛Objective-C。我只是想了解這些可選方法的好處,以便更好地理解語言。

我真的很感激,如果有人可以提供一些真實世界的情況下(與示例代碼)可選的方法是有用的。

回答

14

我給你舉個例子。我有許多與Flickr API交談的ObjC類。其中一個名爲FKAccount可以做很多與Flickr用戶帳戶相關的事情,包括下載用戶的照片,獲取他們的聯繫人列表等。

FKAccount類定義了一個委託協議FKAccountDelegate。該協議指定了許多回調方法,這些回調方法將根據各種網絡操作對Flickr的成功或失敗情況在其代理上調用。不是每個使用FKAccount的應用程序都會對每個可以執行的Flickr操作感興趣。如果要求每個要求執行FKAccountDelegate協議的類都實現了每種方法,那麼最終會有很多存根方法(FWIW,在FKAccountDelegate中定義了41種方法)。當這些方法在協議中被聲明爲@optional時,委託只需要實現它有興趣接收的回調。

FKAccount類檢查,其代表迴應了協議@optional方法是:

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) { 
    [self.delegate accountDidDownloadContacts: self]; 
} 
+0

我想我得到它現在。 C#接口只是Objective-C協議的一個方面。您可以使用協議作爲契約,但這些可選方法構成對象可以選擇響應的可選委託的列表。這真的很有趣。 – kim3er 2009-07-09 11:45:27