Objective-C Language
протоколы
Поиск…
Определение базового протокола
Определение нового протокола:
@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)
];