it-swarm.com.de

Wie erstelle ich ein Protokoll mit optionalen Methoden?

Ich habe in mehreren im iPhone SDK definierten Protokollen Methoden als optional markiert festgestellt, z. B. das Protokoll UIActionSheetDelegate.

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

128
jpm

Von der Seite Apple auf " 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, mit dem die Semantik des Standardverhaltens formal angegeben wird. 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
240
Matt Gallagher

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 folgendermaßen getestet:

NSString *thisSegmentTitle;
if ([self.dataSource respondsToSelector:@selector(titleForSegmentAtIndex:)]) {
    thisSegmentTitle = [self.dataSource titleForSegmentAtIndex:index];
}

Die Methode responsondsToSelector: 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. ansonsten bleibt der Titel gleich Null.

30
Zephyr

Protokolle ist ein Regelwerk. Wir können Protokolle wie folgt 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
Vikram Biwal

Verwenden Sie die @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
11
e.James

Protokolle verhalten sich wie abstrakte Klassen. Das Schlüsselwort @optional definiert daher die Methoden, die für die Implementierung optional sind.

Daher sind im Code someMethod1, someMethod2 und someMethod4 erforderliche Methoden (müssen implementiert werden). someMethod3 ist optional. Wenn diese Methode nicht implementiert wurde, 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
4
user3540599