Lista de sintaxis de declaración de bloque
En todo momento, dejemos
return_type
ser el tipo de objeto / primitivo / etc. te gustaría volver (comúnmente void
)
blockName
ser el nombre variable del bloque que estás creando
var_type
ser el tipo objeto / primitivo / etc. desea pasar como argumento (déjelo en blanco sin parámetros)
varName
ser el nombre de la variable del parámetro dado
Y recuerde que puede crear tantos parámetros como desee.
Bloques como variables
Posiblemente el más común para la declaración.
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
Bloques como propiedades
Al igual que declarar bloques como variables, aunque sutilmente diferentes.
@property (copy) return_type (^blockName) (var_type);
Bloques como Parámetros
Tenga en cuenta que esto es distinto de "Bloques como argumentos"; en este caso, estás declarando un método que quiere un argumento de bloque.
- (void)yourMethod:(return_type (^)(var_type))blockName;
Bloques como argumentos
Tenga en cuenta que esto es distinto de "Bloques como parámetros"; en este caso, está llamando a un método que quiere un argumento de bloque con un bloque anónimo. Si ya ha declarado una variable de bloque, es suficiente pasar el nombre de la variable como argumento.
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
Bloque anónimo
Funcionalmente es un bloque anónimo, sin embargo, la sintaxis para asignar bloques a variables es simplemente establecer la variable igual a un bloque anónimo.
^return_type (var_type varName)
{
//...
};
typedef
Bloquear
Esto le permite configurar un nombre corto al que se puede hacer referencia como cualquier otro nombre de clase durante la declaración de bloques.
typedef return_type (^blockName)(var_type);
Para luego utilizarlo en blockName
lugar de la sintaxis estándar de declaración de bloque, simplemente sustitúyalo.
Bloque en línea
Podría decirse que esta es una utilización menos útil de los bloques, pero no obstante puede tener su lugar. Un bloque en línea es un bloque anónimo llamado inmediatamente después de la creación de instancias.
^return_type (var_type varName)
{
//...
}(var);
Los bloques en línea son principalmente útiles para la compensación de alcance, y son más o menos equivalentes a fragmentos simples de código delimitados por llaves.
{
//...
}
Bloques recursivos
Esto le permite llamar a un bloque de sí mismo, creando un bucle que puede usarse durante devoluciones de llamada y llamadas GCD. Este método de creación de instancias está libre de ciclos de retención en ARC.
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
Bloques de retorno
Un método puede devolver un bloque,
- (return_type(^)(var_type))methodName
{
// ...
}
como puede una función, aunque sea un poco extraño.
return_type (^FunctionName())(var_type)
{
// ...
}
Addendums
Si me he perdido algo, hágamelo saber en los comentarios y lo investigaré / agregaré.
Ah, y en Swift ...
blockName = (varName: var_type) -> (return_type)
Es casi como si fuera una característica del lenguaje.