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.