Реальные примеры методов @opional protocol

Сейчас я изучаю Objective-C и наткнулся на дополнительные методы в протоколах. Мой фон - C #, и я вижу протокол как нечто похожее на интерфейс C #.

Если интерфейс C # представляет контракт, объявляя интерфейс, вы заявляете, что будете реализовывать определенные методы.

Имея это в виду, я смущен, почему вам когда-либо понадобится определить необязательный метод. Это не грязь или попытка уменьшить Objective-C, я люблю Objective-C. Я просто хочу понять преимущества этих дополнительных методов, чтобы лучше понять язык.

Я был бы очень признателен, если бы кто-то мог предоставить некоторые реальные сценарии (с примером кода), где необязательные методы полезны.

Ответы на вопрос(1)

Решение Вопроса

которые общаются с Flickr API. Один, называетсяFKAccount может делать много вещей, связанных с учетной записью пользователя Flickr, включая загрузку фотографий пользователя, получение их списка контактов и так далее.

FKAccount класс определяет протокол делегатаFKAccountDelegate, Этот протокол определяет несколько методов обратного вызова, которыеFKAccount вызовет своего делегата в зависимости от успеха или неудачи различных сетевых операций Flickr. Не каждое приложение, которое используетFKAccount будет заинтересован в каждой операции Flickr, котораяFKAccount может выполнять.

Если бы требовалось, чтобы каждый класс, претендующий на реализациюFKAccountDelegate В протоколе реализован каждый метод, в результате вы получите множество методов-заглушек (FWIW, вFKAccountDelegate). Когда эти методы объявлены@optional в протоколе делегату нужно только реализовать обратные вызовы, которые он заинтересован в получении.

FKAccount класс проверяет, отвечает ли его делегат@optional методы в протоколе:

if([self.delegate respondsToSelector: @selector(accountDidDownloadContacts:)]) {
    [self.delegate accountDidDownloadContacts: self];
}
 09 июл. 2009 г., 14:27
+1 за использование протокола для документирования делегированных функций
 kim3er09 июл. 2009 г., 13:45
Я думаю, что я понимаю это сейчас. Интерфейс C # - это только один аспект протокола Objective C. Вы можете использовать протокол в качестве контракта, но эти необязательные методы составляют список необязательных делегатов, на которые объект может также ответить. Это действительно интересно.
 11 июл. 2009 г., 01:54
Я полностью согласен с @Tom. До Objective-C 2.0 методы делегата обычно объявлялись в категории NSObject, чтобы любой класс, желающий быть делегатом, не нуждался в реализации всех методов. Необязательные методы в протоколах - это гораздо более чистое решение, которое не привязывает тонны методов к NSObject и помогает избежать конфликтов методов. Если бы только Java имела дополнительные методы интерфейса, не было бы необходимости в таких вещах, как наследование от MouseAdapter. Использование таких классов, как правило, несколько раз, когда я проклинал одиночное наследование ... :-)

Ваш ответ на вопрос