276 votes

La syntaxe de déclaration bloqués

Bloc de syntaxe en Objective C (et en effet C, je suppose) est notoirement incongru. En passant de blocs comme arguments semble différente de celle de déclarer des blocs comme ivars, qui semble différente de celle `` ing blocs.

Y at-il une liste complète de la syntaxe de la déclaration-bloc que je pourrais garder sous la main pour référence rapide ?

692voto

pcperini Points 11448

Liste de Bloc de Déclaration de Syntaxes

Dans l'ensemble, laissez

  • return_type être le type de l'objet/primitif/etc. vous souhaitez retourner (communément void)
  • blockName être le nom de la variable du bloc que vous êtes en train de créer
  • var_type être le type de l'objet/primitif/etc. vous souhaitez passer comme argument (laisser vide si pas de paramètres)
  • varName être le nom de la variable du paramètre donné

Et n'oubliez pas que vous pouvez créer autant de paramètres que vous souhaitez.

Les blocs comme des Variables

Peut-être le plus commun pour de déclaration.

return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
    // ...
};

Les blocs comme des Propriétés

Beaucoup, comme la déclaration de blocs de variables, mais subtilement différentes.

@property (copy) return_type (^blockName) (var_type);

Les blocs comme des Paramètres

Notez que ceci est différent de "Blocs comme Arguments"; dans ce cas, vous êtes de la déclaration d'une méthode qui se veut un bloc argument.

- (void)yourMethod:(return_type (^)(var_type))blockName;

Les blocs comme des Arguments

Notez que ceci est différent de "Blocs de Paramètres"; dans ce cas, vous êtes à l'appel d'une méthode qui se veut un bloc argument avec un bloc anonyme. Si vous avez déjà déclaré une variable d'un bloc, il suffit de passer le nom de la variable comme argument.

[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
    //...
}];

Bloc Anonyme

C'est fonctionnellement un bloc anonyme, cependant la syntaxe pour l'attribution de blocs de variables est simplement de définir la variable est égale à un bloc anonyme.

^return_type (var_type varName)
{
    //...
};

typedef Bloc

Cela vous permet de définir un nom court qui peut être référencé comme tout autre nom de la classe lors de la déclaration de blocs.

typedef return_type (^blockName)(var_type);

Pour ensuite les utiliser plus tard blockName , au lieu de la norme bloc de syntaxe de déclaration, il vous suffit de remplacer.

Inline Block

C'est sans doute moins utile l'utilisation de blocs, mais peut avoir sa place tout de même. Un inline-block est un bloc anonyme appelée immédiatement après l'instanciation.

^return_type (var_type varName)
{
    //...
}(var);

Inline blocs sont principalement utile pour la portée de compensation, et sont à peu près équivalent à de simples délimité par des accolades morceaux de code.

{
   //...
}

Récursive Blocs

Cela vous permet d'appeler un bloc de lui-même, créer une boucle qui peut être utilisé lors des rappels et PGCD des appels. Cette méthode d'instanciation est libre de conserver les cycles de l'ARC.

__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
    if (returnCondition)
    {
        blockName = nil;
        return;
    }

    // ...
} copy];
blockName(varValue);

De Retour Blocs

Une méthode peut retourner d'un bloc,

- (return_type(^)(var_type))methodName
{
    // ...
}

comme une fonction, si c'est un peu étrange.

return_type (^FunctionName())(var_type)
{
    // ...
}

Addenda

Si j'ai oublié quelque chose, s'il vous plaît laissez-moi savoir dans les commentaires, et je vais de recherche/ajouter.

Oh, et en Swift...

blockName = (varName: var_type) -> (return_type)

C'est presque comme si c'est une fonctionnalité du langage.

81voto

psy Points 1522

Personnellement, j’aime utiliser ce site Web (http://fuckingblocksyntax.com). Le nom est plus facile de se rappeler que la syntaxe du bloc lui-même :

http://fuckingblocksyntax.com

et si vous ne peut pas charger les URLs avec mauvais mots en eux, vous pouvez utiliser ce miroir : http://goshdarnblocksyntax.com

fuckingblocksyntax website

39voto

Erik Aigner Points 7182

Typedef :

Inline :

Méthode :

16voto

omz Points 38947

La bibliothèque de Xcode 4 extrait contient des modèles pour les blocs typedefs et inline de bloc comme variables. Ils sont également disponibles via la saisie semi-automatique ( et ).

Pour les blocs en tant qu’arguments aux méthodes, je recommanderais déclarant un `` et puis tout simplement en utilisant ce. Il rend le code plus facile à lire.

3voto

Alex Zavatone Points 901

Si vous devez travailler dans Xcode 4.2, vous pouvez également @synthesize un bloc déclaré comme un bien‑fonds comme vous le feriez avec un bloc non. Ne laissez pas la syntaxe du bloc vous jeter.

Si votre propriété de bloc est la suivante :

Ensuite, votre @synthesize est la suivante :

A bientôt.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X