Odpowiedzi:
Ze strony Apple w sekcji „ Formalne protokoły ”:
Opcjonalne metody protokołu można oznaczyć jako opcjonalne przy użyciu słowa kluczowego @optional. Odpowiadając słowu kluczowemu @optional modal, istnieje słowo kluczowe @required, które formalnie oznacza semantykę zachowania domyślnego. Możesz użyć @optional i @required, aby podzielić swój protokół na sekcje według własnego uznania. Jeśli nie określisz żadnego słowa kluczowego, wartością domyślną jest @required.
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
Jeśli metoda w protokole jest oznaczona jako opcjonalna, przed przystąpieniem do jej wywołania należy sprawdzić, czy obiekt implementuje tę metodę.
Na przykład widok wykresu kołowego może testować metodę tytułu segmentu w następujący sposób:
NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}
Metoda respondsToSelector: używa selektora, który po kompilacji odwołuje się do identyfikatora metody. Możesz podać poprawny identyfikator, używając dyrektywy @selector () i określając nazwę metody.
Jeśli źródło danych w tym przykładzie implementuje metodę, zostanie użyty tytuł; w przeciwnym razie tytuł pozostaje zerowy.
@protocol MyProtocol <NSObject>
Protokoły to zbiór reguł. Możemy stworzyć protokoły jak na poniższym przykładzie:
TestProtocols.h
@protocol TestProtocols <NSObject>
@optional
-(void)testMethodOptional;
@required // by default
-(void)testMethodRequired;
@end
Realizacja:
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
Użyj @optional
słowa kluczowego przed deklaracją metody, aby uczynić ją opcjonalną. Proste!
// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
//...
@end
Protokoły działają tak samo jak klasy abstrakcyjne, więc słowo kluczowe @optional definiuje te metody, które są opcjonalne do implementacji.
Tak więc w kodzie niektóreMethod1, someMethod2 i someMethod4 są metodami wymaganymi (muszą być zaimplementowane). someMethod3 jest opcjonalna - jeśli nie zaimplementowaliśmy tej metody, kompilator nie będzie generował żadnych ostrzeżeń.
@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