Ответы:
Со страницы 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];
}
RespdsToSelector: метод использует селектор, который ссылается на идентификатор метода после компиляции. Вы можете предоставить правильный идентификатор, используя директиву @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 определяет те методы, которые являются необязательными для реализации.
Итак, в коде someMethod1, someMethod2 и someMethod4 являются обязательными методами (должны быть реализованы). 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