Wie erstelle ich ein Protokoll mit optionalen Methoden?


133

Ich habe Methoden festgestellt, die in mehreren im iPhone SDK definierten Protokollen als optional markiert sind, z. B. im UIActionSheetDelegateProtokoll.

Wie kann ich ein eigenes Protokoll definieren und einige der Methoden als optional festlegen?

Antworten:


248

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

4
Beachten Sie Folgendes: Die Direktive '' '@optional' '' und '' '@required' '' gilt für alle darauf folgenden Methoden.
Wayne

31

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.


7
Stellen Sie sicher, dass Sie NSObject in Ihrem Protokoll erweitern, um respondsToSelector
Fracdroid

1
Richtig, wie@protocol MyProtocol <NSObject>
Lawrence Kesteloot

Dies ist eine perfekte Antwort!
Smoothdvd

14

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

12

Verwenden Sie das @optionalSchlü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

6

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.