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

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

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

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

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

Ответ 1

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

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

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

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

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