Поиск…


Определение базового протокола

Определение нового протокола:

@protocol NewProtocol

- (void)protocolMethod:(id)argument;

- (id)anotherMethod;

@end

Необязательные и требуемые методы

По умолчанию требуются все методы, объявленные в протоколе. Это означает, что любой класс, соответствующий этому протоколу, должен реализовывать эти методы.

Также можно объявить необязательные методы. Этот метод может быть реализован только при необходимости.

Вы @optional необязательные методы с @optional директивы @optional .

@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
@end

В этом случае только anotherMethod помечен как необязательный; предполагается, что методы без директивы @optional требуются.

Директива @optional применяется к последующим методам до конца определения протокола или, пока не будет найдена другая директива.

@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
- (void)andAnotherMethod:(id)argument;
@required
- (void)lastProtocolMethod;
@end

Этот последний пример определяет протокол с двумя необязательными методами и двумя необходимыми методами.

Соответствие протоколам

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

@interface NewClass : NSObject <NewProtocol>
...
@end

Это означает, что любой экземпляр NewClass будет отвечать на методы, объявленные в его интерфейсе, но также предоставит реализацию для всех необходимых методов NewProtocol .

Также класс может соответствовать нескольким протоколам, разделяя их запятой.

@interface NewClass : NSObject <NewProtocol, AnotherProtocol, MyProtocol>
...
@end

Подобно тому, как он соответствует одному протоколу, класс должен реализовать каждый необходимый метод для каждого протокола и каждый необязательный метод, который вы хотите реализовать.

Передовые декларации

Можно объявить имя протокола без методов:

@protocol Person;

используйте его код (определение класса и т. д.):

@interface World : NSObject
@property (strong, nonatomic) NSArray<id<some>> *employees;
@end

и позже определите метод протокола где-то в вашем коде:

@protocol Person
- (NSString *)gender;
- (NSString *)name;
@end

Это полезно, когда вам не нужно знать данные протокола, пока вы не импортируете этот файл с определением протокола. Таким образом, ваш заголовочный файл класса остается ясным и содержит только сведения о классе.

Проверка существования опционных методов

if ([object respondsToSelector:@selector(someOptionalMethodInProtocol:)])
{
    [object someOptionalMethodInProtocol:argument];
}

Проверить соответствие протокола

Возвращает логическое значение, указывающее, соответствует ли класс протоколу:

[MyClass conformsToProtocol:@protocol(MyProtocol) ];



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow