Реальные примеры методов @opional protocol - PullRequest
10 голосов
/ 09 июля 2009

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

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

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

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

1 Ответ

14 голосов
/ 09 июля 2009

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

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

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

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

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