我正在學習Objective-C,並在協議中遇到了可選方法。我的背景是C#,並且可以將協議看作與C#接口類似的東西。@optional協議方法的真實世界示例
凡C#接口代表一個合同,通過廣告接口,你說你會實現定義的方法。
考慮到這一點,我很困惑爲什麼你需要定義一個可選的方法。這不是誹謗或企圖減少Objective-C,我愛Objective-C。我只是想了解這些可選方法的好處,以便更好地理解語言。
我真的很感激,如果有人可以提供一些真實世界的情況下(與示例代碼)可選的方法是有用的。
我正在學習Objective-C,並在協議中遇到了可選方法。我的背景是C#,並且可以將協議看作與C#接口類似的東西。@optional協議方法的真實世界示例
凡C#接口代表一個合同,通過廣告接口,你說你會實現定義的方法。
考慮到這一點,我很困惑爲什麼你需要定義一個可選的方法。這不是誹謗或企圖減少Objective-C,我愛Objective-C。我只是想了解這些可選方法的好處,以便更好地理解語言。
我真的很感激,如果有人可以提供一些真實世界的情況下(與示例代碼)可選的方法是有用的。
我給你舉個例子。我有許多與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];
}
我想我得到它現在。 C#接口只是Objective-C協議的一個方面。您可以使用協議作爲契約,但這些可選方法構成對象可以選擇響應的可選委託的列表。這真的很有趣。 – kim3er 2009-07-09 11:45:27