Что такое протокол?

Я прочитал документацию, но я все еще смущен. Может кто-нибудь объяснить, что такое протокол? (Вы могли бы привести примеры кода, но я действительно ищу объяснения)

Ответ 1

Вот отличная статья об этом. Фактически, протокол в Objective-C очень похож на интерфейс в Java или чистый виртуальный класс в С++ (хотя не так, как чистые виртуальные классы могут иметь члены данных...). Это в основном гарантия того, что конкретный класс знает, как реагировать на заданный набор методов (сообщений).

Изменить Исходная статья исчезла, поэтому я заменил ее другим учебником.

Ответ 2

Протокол - это средство для определения списка необходимых и/или необязательных методов, которые реализует класс. Если класс принимает протокол, он должен внедрять все необходимые методы в принимаемых им протоколах. Cocoa использует протоколы для поддержки межпроцессного взаимодействия через сообщения Objective-C. Кроме того, поскольку Objective-C не поддерживает множественное наследование, вы можете добиться аналогичной функциональности с протоколами, поскольку класс может принимать более одного протокола.

Хорошим примером протокола является NSCoding, который имеет два требуемых метода, которые должен реализовать класс. Этот протокол используется для того, чтобы позволить кодировать и декодировать классы, то есть архивирование объектов путем записи в постоянное хранилище.

   @protocol NSCoding

     -(void)encodeWithCoder:(NSCoder *)aCoder;

     -(id)initWithCoder:(NSCoder *)aDecoder;

   @end

Чтобы принять протокол, приложите имя протокола в < > , как показано ниже

   @interface SomeClass : NSObject <NSCoding> 

    {
     some variables
    }

Как определить протокол?

Мы можем создать как обязательные необязательные методы в протоколе. Ниже следует определение протокола с именем "Hello":

   @protocol Hello
    - (BOOL)send:(id)data;
    - (id)received;
   @optional
    - (int)progress;
   @end

Чтобы использовать протокол, как и в примере выше, объявите протокол в интерфейсе и напишите необходимые методы в реализации класса:

//Интерфейс      @interface AnotherClass: NSObject

   {
    some declaration
   }

//Реализация      @implementation AnotherClass

  - (BOOL)send:(id)data
   {
    some declaration
   }

  - (id)received
   {
    some code
   }

//Необязательный метод

  - (int)progress
   {
    some code 
   }
   @end

Я надеюсь, что это поможет вам узнать протокол.