Objective-C Language
Protokolle
Suche…
Basisprotokolldefinition
Definieren eines neuen Protokolls:
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
- (id)anotherMethod;
@end
Optionale und erforderliche Methoden
Standardmäßig sind alle in einem Protokoll deklarierten Methoden erforderlich. Das bedeutet, dass jede Klasse, die diesem Protokoll entspricht, diese Methoden implementieren muss.
Es ist auch möglich, optionale Methoden zu deklarieren. Diese Methode kann nur bei Bedarf implementiert werden.
Sie markieren optionale Methoden mit der Direktive @optional
.
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
@end
In diesem Fall wird nur eine anotherMethod
als optional markiert. @optional
wird angenommen, dass die Methoden ohne die Direktive @optional
erforderlich sind.
Die Direktive @optional
gilt für die folgenden Methoden bis zum Ende der Protokolldefinition oder bis eine andere Direktive gefunden wird.
@protocol NewProtocol
- (void)protocolMethod:(id)argument;
@optional
- (id)anotherMethod;
- (void)andAnotherMethod:(id)argument;
@required
- (void)lastProtocolMethod;
@end
Das letzte Beispiel definiert ein Protokoll mit zwei optionalen Methoden und zwei erforderlichen Methoden.
Übereinstimmung mit Protokollen
Die folgende Syntax gibt an, dass eine Klasse ein Protokoll mit spitzen Klammern verwendet.
@interface NewClass : NSObject <NewProtocol>
...
@end
Dies bedeutet, dass jede Instanz von NewClass auf in ihrer Schnittstelle deklarierte Methoden reagiert, aber auch eine Implementierung für alle erforderlichen Methoden von NewProtocol
.
Es ist auch möglich, dass eine Klasse mehreren Protokollen entspricht, indem sie durch Kommas getrennt wird.
@interface NewClass : NSObject <NewProtocol, AnotherProtocol, MyProtocol>
...
@end
Wie bei der Konformität mit einem einzelnen Protokoll muss die Klasse jede erforderliche Methode jedes Protokolls und jede optionale Methode implementieren, die Sie zur Implementierung auswählen.
Erklärungen weiterleiten
Es ist möglich, Protokollnamen ohne Methoden zu deklarieren:
@protocol Person;
Verwenden Sie Ihren Code (Klassendefinition usw.):
@interface World : NSObject
@property (strong, nonatomic) NSArray<id<some>> *employees;
@end
und definieren Sie später die Protokollmethode irgendwo in Ihrem Code:
@protocol Person
- (NSString *)gender;
- (NSString *)name;
@end
Dies ist nützlich, wenn Sie die Protokolldetails erst kennen müssen, wenn Sie diese Datei mit der Protokolldefinition importieren. Daher bleibt Ihre Klassenheaderdatei frei und enthält nur Details zur Klasse.
Vorhandensein optionaler Methodenimplementierungen prüfen
if ([object respondsToSelector:@selector(someOptionalMethodInProtocol:)])
{
[object someOptionalMethodInProtocol:argument];
}
Überprüfen Sie das Protokoll
Gibt einen booleschen Wert zurück, der angibt, ob die Klasse dem Protokoll entspricht:
[MyClass conformsToProtocol:@protocol(MyProtocol)
];