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

J’ai remarqué des méthodes marquées comme facultatives dans plusieurs protocoles définis dans le SDK de l’iPhone, comme le protocole UIActionSheetDelegate par exemple.

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

De la page Apple sur les ” 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 indiquer formellement la sémantique du comportement par défaut. Vous pouvez utiliser @optional et @required pour partitionner votre protocole en sections comme vous le souhaitez. 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 

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

Par exemple, la vue graphique en secteurs peut tester la méthode du titre de segment comme suit:

 NSSsortingng *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’identificateur d’une méthode après la compilation. Vous pouvez fournir l’identificateur correct en utilisant la directive @selector () et en spécifiant le nom de la méthode.

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

Utilisez le mot-clé @optional avant votre déclaration de méthode pour le rendre facultatif. Aussi simple que cela!

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

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

TestProtocols.h

 @protocol TestProtocols  @optional -(void)testMethodOptional; @required // by default -(void)testMethodRequired; @end 

La mise en oeuvre:

TestClass.h

 #import "TestProtocols.h" @interface TestClass : NSObject  @end 

TestClass.m

 #import "TestClass.h" @implemenation TestClass //optional to implement -(void)testMethodOptional{ // Your Code } //required to implement -(void)testMethodRequired{ // Your Code } @end 

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 lancera aucun avertissement.

 @protocol myPrtocol -(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  //... @end