Antworten:
Von der Apple-Seite zu " Formal Protocols ":
Optionale Protokollmethoden können mit dem Schlüsselwort @optional als optional markiert werden. Entsprechend dem Schlüsselwort @optional modal gibt es ein Schlüsselwort @required, um die Semantik des Standardverhaltens formal zu kennzeichnen. Sie können @optional und @required verwenden, um Ihr Protokoll nach Belieben in Abschnitte zu unterteilen. Wenn Sie kein Schlüsselwort angeben, lautet der Standardwert @required.
@protocol MyProtocol
- (void)requiredMethod;
@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;
@required
- (void)anotherRequiredMethod;
@end
Wenn eine Methode in einem Protokoll als optional markiert ist, müssen Sie überprüfen, ob ein Objekt diese Methode implementiert, bevor Sie versuchen, sie aufzurufen.
In der Kreisdiagrammansicht wird beispielsweise die Segmenttitelmethode wie folgt getestet:
NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}
Die Methode respondsToSelector: verwendet einen Selektor, der nach der Kompilierung auf den Bezeichner einer Methode verweist. Sie können den richtigen Bezeichner angeben, indem Sie die Direktive @selector () verwenden und den Namen der Methode angeben.
Wenn die Datenquelle in diesem Beispiel die Methode implementiert, wird der Titel verwendet. Andernfalls bleibt der Titel gleich Null.
@protocol MyProtocol <NSObject>
Protokolle sind Regeln. Wir können Protokolle wie im folgenden Beispiel erstellen:
TestProtocols.h
@protocol TestProtocols <NSObject>
@optional
-(void)testMethodOptional;
@required // by default
-(void)testMethodRequired;
@end
Implementierung:
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
Verwenden Sie das @optional
Schlüsselwort vor Ihrer Methodendeklaration, um es optional zu machen. So einfach ist das!
// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end
// myClass.m
@interface myClass : someSuperClass <myProtocol>
//...
@end
Protokolle verhalten sich genauso wie abstrakte Klassen, daher definiert das Schlüsselwort @optional die Methoden, die für die Implementierung optional sind.
Im Code sind also someMethod1, someMethod2 und someMethod4 erforderliche Methoden (müssen implementiert werden). someMethod3 ist optional. Wenn wir diese Methode nicht implementiert haben, gibt der Compiler keine Warnungen aus.
@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