Liste des syntaxes de déclaration de bloc
Tout au long, laissez
return_type
être le type d'objet / primitif / etc. vous souhaitez revenir (généralement void
)
blockName
être le nom de variable du bloc que vous créez
var_type
être le type objet / primitif / etc. vous souhaitez passer comme argument (laissez vide pour aucun paramètre)
varName
être le nom de variable du paramètre donné
Et n'oubliez pas que vous pouvez créer autant de paramètres que vous le souhaitez.
Blocs en tant que variables
Peut-être le plus commun pour la déclaration.
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
Blocs en tant que propriétés
Tout comme déclarer des blocs en tant que variables, bien que subtilement différents.
@property (copy) return_type (^blockName) (var_type);
Blocs en tant que paramètres
Notez que ceci est distinct de "Blocks as Arguments"; dans ce cas, vous déclarez une méthode qui veut un argument de bloc.
- (void)yourMethod:(return_type (^)(var_type))blockName;
Blocs comme arguments
Notez que ceci est distinct de "Blocks as Parameters"; dans ce cas, vous appelez une méthode qui veut un argument de bloc avec un bloc anonyme. Si vous avez déjà déclaré une variable de bloc, il suffit de passer le nom de la variable comme argument.
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
Bloc anonyme
Il s'agit fonctionnellement d'un bloc anonyme, mais la syntaxe d'attribution des blocs aux variables consiste simplement à définir la variable égale à un bloc anonyme.
^return_type (var_type varName)
{
//...
};
typedef
Bloquer
Cela vous permet de configurer un nom court qui peut être référencé comme tout autre nom de classe lors de la déclaration des blocs.
typedef return_type (^blockName)(var_type);
Pour ensuite utiliser plus tard blockName
au lieu de la syntaxe de déclaration de bloc standard, remplacez simplement.
Bloc en ligne
Il s'agit sans doute d'une utilisation moins utile des blocs, mais elle peut néanmoins avoir sa place. Un bloc en ligne est un bloc anonyme appelé immédiatement après l'instanciation.
^return_type (var_type varName)
{
//...
}(var);
Les blocs en ligne sont principalement utiles pour la compensation de portée, et sont à peu près équivalents à de simples morceaux de code séparés par des accolades.
{
//...
}
Blocs récursifs
Cela vous permet d'appeler un bloc à partir de lui-même, créant une boucle qui peut être utilisée pendant les rappels et les appels GCD. Cette méthode d'instanciation est exempte de cycles de rétention dans ARC.
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
Retour des blocs
Une méthode peut retourner un bloc,
- (return_type(^)(var_type))methodName
{
// ...
}
comme le peut une fonction, si un peu étrangement.
return_type (^FunctionName())(var_type)
{
// ...
}
Addendums
Si j'ai oublié quelque chose, faites-le moi savoir dans les commentaires, et je les rechercherai / les ajouterai.
Oh, et dans Swift ...
blockName = (varName: var_type) -> (return_type)
C'est presque comme si c'était une fonction de langue.