Blocs Objective-C

Une classe Objective-C définit un objet qui combine des données avec un comportement associé. Parfois, il est logique de ne représenter qu'une seule tâche ou unité de comportement, plutôt qu'un ensemble de méthodes.

Les blocs sont une fonctionnalité au niveau du langage ajoutée à C, Objective-C et C ++ qui vous permet de créer des segments de code distincts qui peuvent être transmis aux méthodes ou aux fonctions comme s'il s'agissait de valeurs. Les blocs sont des objets Objective-C, ce qui signifie qu'ils peuvent être ajoutés à des collections telles que NSArray ou NSDictionary. Ils ont également la capacité de capturer les valeurs de la portée englobante, ce qui les rend similaires aux fermetures ou aux lambdas dans d'autres langages de programmation

Syntaxe de déclaration de bloc simple

returntype (^blockName)(argumentType);

Implémentation de bloc simple

returntype (^blockName)(argumentType)= ^{
};

Voici un exemple simple

void (^simpleBlock)(void) = ^{
   NSLog(@"This is a block");
};

Nous pouvons invoquer le bloc en utilisant

simpleBlock();

Les blocs prennent des arguments et des valeurs de retour

Les blocs peuvent également prendre des arguments et renvoyer des valeurs tout comme des méthodes et des fonctions.

Voici un exemple simple pour implémenter et appeler un bloc avec des arguments et des valeurs de retour.

double (^multiplyTwoValues)(double, double) = 
   ^(double firstValue, double secondValue) {
      return firstValue * secondValue;
   };

double result = multiplyTwoValues(2,4); 
NSLog(@"The result is %f", result);

Blocs utilisant des définitions de type

Voici un exemple simple d'utilisation de typedef dans un bloc. Veuillez noter cet exempledoesn't work sur le online compilerpour l'instant. UtilisationXCode pour exécuter la même chose.

#import <Foundation/Foundation.h>

typedef void (^CompletionBlock)();
@interface SampleClass:NSObject
- (void)performActionWithCompletion:(CompletionBlock)completionBlock;
@end

@implementation SampleClass

- (void)performActionWithCompletion:(CompletionBlock)completionBlock {

   NSLog(@"Action Performed");
   completionBlock();
}

@end

int main() {
   
   /* my first program in Objective-C */
   SampleClass *sampleClass = [[SampleClass alloc]init];
   [sampleClass performActionWithCompletion:^{
      NSLog(@"Completion is called to intimate action is performed.");
   }];

   return 0;
}

Compilons et exécutons-le, cela produira le résultat suivant -

2013-09-10 08:13:57.155 demo[284:303] Action Performed
2013-09-10 08:13:57.157 demo[284:303] Completion is called to intimate action is performed.

Les blocs sont davantage utilisés dans les applications iOS et Mac OS X. Il est donc plus important de comprendre l'utilisation des blocs.