Відповіді:
На сторінці Apple у розділі " Формальні протоколи ":
Необов'язкові методи протоколу можуть бути позначені як необов'язкові за допомогою ключового слова @optional. Відповідно до модального ключового слова @optional, існує ключове слово @required, яке офіційно позначає семантику поведінки за замовчуванням. Ви можете використовувати @optional і @required для розподілу протоколу на розділи, як вважаєте за потрібне. Якщо ви не вказали жодне ключове слово, за замовчуванням використовується @required.
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
Якщо метод у протоколі позначений як необов'язковий, ви повинні перевірити, чи реалізує об'єкт цей метод, перш ніж намагатися викликати його.
Наприклад, вигляд кругової діаграми може перевірити такий спосіб заголовка сегмента:
NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}
Метод respondsToSelector: використовує селектор, який посилається на ідентифікатор методу після компіляції. Ви можете надати правильний ідентифікатор, скориставшись директивою @selector () та вказавши назву методу.
Якщо джерело даних у цьому прикладі реалізує метод, використовується заголовок; інакше заголовок залишається нульовим.
@protocol MyProtocol <NSObject>
Протоколи - це сукупність правил. Ми можемо створити протоколи, як показано нижче:
TestProtocols.h
@protocol TestProtocols <NSObject>
@optional
-(void)testMethodOptional;
@required // by default
-(void)testMethodRequired;
@end
Впровадження:
TestClass.h
#import "TestProtocols.h"
@interface TestClass : NSObject <TestProtocols>
@end
TestClass.m
#import "TestClass.h"
@implemenation TestClass
//optional to implement
-(void)testMethodOptional{
// Your Code
}
//required to implement
-(void)testMethodRequired{
// Your Code
}
@end
Використовуйте @optional
ключове слово перед оголошенням методу, щоб зробити його необов’язковим. Просто як це!
// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
//...
@end
Протоколи діють так само, як абстрактні класи, тому ключове слово @optional визначає ті методи, які необов’язкові для реалізації.
Отже, у коді деякі методи1, деякіМетод2 та деякіМетод4 необхідні методи (повинні бути реалізовані). someMethod3 необов’язковий - якщо ми не реалізували цей метод, компілятор не викине жодних попереджень.
@protocol myPrtocol<NSObject>
-(void)someMethod1:(id)someArgument;
-(void)someMethod2:(id)someArugument;
@optional
-(void)someMethod3:(id)someArgument;
@required //by default
-(void)someMethod4:(id)someArgument;
@end
// sampleClass.m
@interface sampleClass : someSuperClass <myProtocol>
//...
@end