Lista de sintaxes de declaração de bloco
Ao longo, vamos
return_type
seja o tipo de objeto / primitivo / etc. você gostaria de retornar (normalmente void
)
blockName
seja o nome da variável do bloco que você está criando
var_type
seja o tipo objeto / primitivo / etc. você gostaria de passar como argumento (deixe em branco sem parâmetros)
varName
ser o nome da variável do parâmetro especificado
E lembre-se de que você pode criar quantos parâmetros desejar.
Blocos como Variáveis
Possivelmente o mais comum para a declaração.
return_type (^blockName)(var_type) = ^return_type (var_type varName)
{
// ...
};
Blocos como propriedades
É como declarar blocos como variáveis, por mais sutil que sejam.
@property (copy) return_type (^blockName) (var_type);
Blocos como parâmetros
Observe que isso é diferente de "Blocos como argumentos"; Nesse caso, você está declarando um método que deseja um argumento de bloco.
- (void)yourMethod:(return_type (^)(var_type))blockName;
Blocos como argumentos
Observe que isso é diferente de "Blocos como parâmetros"; Nesse caso, você está chamando um método que deseja um argumento de bloco com um bloco anônimo. Se você já declarou uma variável de bloco, é suficiente passar o nome da variável como argumento.
[someObject doSomethingWithBlock: ^return_type (var_type varName)
{
//...
}];
Bloco anônimo
Este é funcionalmente um bloco anônimo, no entanto, a sintaxe para atribuir blocos a variáveis é simplesmente definir a variável igual a um bloco anônimo.
^return_type (var_type varName)
{
//...
};
typedef
Quadra
Isso permite que você configure um nome abreviado que possa ser referenciado como qualquer outro nome de classe durante a declaração de blocos.
typedef return_type (^blockName)(var_type);
Para usar posteriormente, em blockName
vez da sintaxe da declaração de bloco padrão, basta substituir.
Bloco embutido
É indiscutivelmente uma utilização menos útil dos blocos, mas ainda assim pode ter seu lugar. Um bloco embutido é um bloco anônimo chamado imediatamente após a instanciação.
^return_type (var_type varName)
{
//...
}(var);
Os blocos embutidos são úteis principalmente para a compensação do escopo e são aproximadamente equivalentes a simples pedaços de código delimitados por colchetes.
{
//...
}
Blocos Recursivos
Isso permite que você chame um bloco de si mesmo, criando um loop que pode ser usado durante retornos de chamada e chamadas GCD. Esse método de instanciação está livre de ciclos de retenção no ARC.
__block return_type (^blockName)(var_type) = [^return_type (var_type varName)
{
if (returnCondition)
{
blockName = nil;
return;
}
// ...
} copy];
blockName(varValue);
Blocos de retorno
Um método pode retornar um bloco,
- (return_type(^)(var_type))methodName
{
// ...
}
como pode uma função, se um pouco estranha.
return_type (^FunctionName())(var_type)
{
// ...
}
Adendos
Se eu perdi alguma coisa, informe-me nos comentários e eu os pesquisarei / os adicionarei.
Ah, e em Swift ...
blockName = (varName: var_type) -> (return_type)
É quase como se fosse um recurso de idioma.