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?

jpm
quelle

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
Matt Gallagher
quelle
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.

Zephyr
quelle
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
Vikram Biwal
quelle
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
James
quelle
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
user3540599
quelle