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


133

J'ai remarqué des méthodes marquées facultatives dans plusieurs protocoles définis dans le SDK iPhone, comme le UIActionSheetDelegateprotocole par exemple.

Comment puis-je définir mon propre protocole et définir certaines des méthodes comme facultatives?

Réponses:


248

Depuis la page Apple sur " Protocoles formels ":

Les méthodes de protocole facultatives peuvent être marquées comme facultatives à l'aide du mot clé @optional. Correspondant au mot clé modal @optional, il existe un mot clé @required pour désigner formellement la sémantique du comportement par défaut. Vous pouvez utiliser @optional et @required pour partitionner votre protocole en sections comme bon vous semble. 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

4
notez que: Les directives '' '@optional' '' et '' '@required' '' s'appliquent à toutes les méthodes qui la suivent.
Wayne

31

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

À titre d'exemple, la vue de graphique à secteurs peut tester la méthode du titre du segment comme ceci:

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.


7
Assurez-vous d'étendre NSObject dans votre protocole pour utiliser
respondsToSelector

1
Droite, comme@protocol MyProtocol <NSObject>
Lawrence Kesteloot

C'est une réponse parfaite!
smoothdvd

14

Protocols est un ensemble de règles. Nous pouvons créer des protocoles comme l'exemple ci-dessous:

TestProtocols.h

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

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

La mise en oeuvre:

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

Utilisez le @optionalmot - clé avant la déclaration de votre méthode pour la rendre facultative. 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

6

Les protocoles agissent de la même manière que les classes abstraites, de sorte que le mot clé @optional définit les méthodes facultatives pour l'implémentation.

Ainsi, dans le code, someMethod1, someMethod2 et someMethod4 sont des méthodes obligatoires (doivent être implémentées). someMethod3 est facultatif - si nous n'avons pas implémenté cette méthode, le compilateur ne lèvera aucun 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.