132 votes

Comment créer un protocole avec des méthodes optionnelles ?

J'ai remarqué des méthodes marquées comme optionnelles dans plusieurs protocoles définis dans le SDK de l'iPhone, comme la méthode UIActionSheetDelegate par exemple.

Comment puis-je définir un protocole qui m'est propre et rendre certaines méthodes facultatives ?

246voto

Matt Gallagher Points 10431

Extrait de la page Apple sur " Protocoles formels " :

O peuvent être qualifiées d'optionnelles à l'aide du mot-clé @optional. Correspondant au mot-clé @optional modal il existe un mot-clé @required pour indiquer formellement la sémantique du comportement par défaut de le comportement par défaut. Vous pouvez utiliser @optional et @required pour diviser pour diviser votre protocole en sections comme vous le comme vous l'entendez. Si vous ne spécifiez aucun mot-clé la valeur par défaut est @required.

@protocol MyProtocol

- (void)requiredMethod;

@optional
- (void)anOptionalMethod;
- (void)anotherOptionalMethod;

@required
- (void)anotherRequiredMethod;

@end

33voto

Zephyr Points 374

Si une méthode d'un protocole est marquée comme optionnelle, vous devez vérifier si un objet implémente cette méthode avant d'essayer de l'appeler.

Par exemple, la vue du camembert peut tester la méthode du titre du segment de la manière suivante :

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

La méthode respondsToSelector : utilise un sélecteur, qui fait référence à l'identifiant d'une méthode après compilation. Vous pouvez fournir l'identifiant correct en utilisant la directive @selector() et en spécifiant le nom de la méthode.

Si la source de données de cet exemple implémente la méthode, le titre est utilisé ; sinon, le titre reste nul.

14voto

CrazyVK Points 1086

Les protocoles sont des ensembles de règles. Nous pouvons créer des protocoles comme dans l'exemple ci-dessous :

TestProtocols.h

@protocol TestProtocols <NSObject>
    @optional
    -(void)testMethodOptional;

    @required  // by default
    -(void)testMethodRequired;
@end

Mise en œuvre :

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

12voto

e.James Points 51680

Utiliser le @optional avant la déclaration de la méthode pour la rendre facultative. C'est aussi simple que cela !

// myProtocol.h
@protocol myProtocol
- (void)myMandatoryMethod:(id)someArgument;
@optional
- (void)myOptionalMethod:(id)someArgument;
@end

// myClass.m
@interface myClass : someSuperClass <myProtocol>
    //...
@end

6voto

user3540599 Points 11

Les protocoles agissent comme des classes abstraites, c'est pourquoi le mot-clé @optional définit les méthodes dont l'implémentation est facultative.

Ainsi, dans le code, someMethod1, someMethod2 et someMethod4 sont des méthodes obligatoires (qui doivent être implémentées). someMethod3 est optionnelle - si nous n'implémentons pas cette méthode, le compilateur ne lancera pas d'avertissement.

@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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X