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?

jpm
la source

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
Matt Gallagher
la source
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.

Zéphyr
la source
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
Vikram Biwal
la source
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
e.James
la source
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
user3540599
la source