A sintaxe do bloco no Objetivo C (e de fato C, presumo) é notoriamente incongruente. Passar blocos como argumentos parece diferente de declarar blocos como ivars, que parece diferente de um typedef
bloco.
Existe uma lista abrangente de sintaxe de declaração de bloco que eu poderia manter à mão para referência rápida?
objective-c
syntax
objective-c-blocks
Patrick Perini
fonte
fonte
Respostas:
Lista de sintaxes de declaração de bloco
Ao longo, vamos
return_type
seja o tipo de objeto / primitivo / etc. você gostaria de retornar (normalmentevoid
)blockName
seja o nome da variável do bloco que você está criandovar_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 especificadoE lembre-se de que você pode criar quantos parâmetros desejar.
Blocos como Variáveis
Possivelmente o mais comum para a declaração.
Blocos como propriedades
É como declarar blocos como variáveis, por mais sutil que sejam.
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.
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.
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.
typedef
QuadraIsso permite que você configure um nome abreviado que possa ser referenciado como qualquer outro nome de classe durante a declaração de blocos.
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.
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.
Blocos de retorno
Um método pode retornar um bloco,
como pode uma função, se um pouco estranha.
Adendos
Se eu perdi alguma coisa, informe-me nos comentários e eu os pesquisarei / os adicionarei.
Ah, e em Swift ...
É quase como se fosse um recurso de idioma.
fonte
BlockType ^blockVar = Anonymous Block
mostra erro de sintaxe, sem ^ também :(Pessoalmente, gosto de usar este site ( http://fuckingblocksyntax.com ). O nome é mais fácil de lembrar do que a própria sintaxe do bloco:
http://fuckingblocksyntax.com
e se você não puder carregar URLs com palavrões, poderá usar este espelho: http://goshdarnblocksyntax.com
fonte
Typedef:
Na linha:
Método:
fonte
A biblioteca de trechos do Xcode 4 contém modelos para typedefs de bloco e blocos embutidos como variáveis. Eles também estão disponíveis através do preenchimento automático (
typedefblock
einlineblock
).Para blocos como argumentos para métodos, eu recomendaria declarar um
typedef
e simplesmente usá-lo. Isso torna o código muito mais fácil de ler.fonte
Escrevi um completeBlock para uma classe que retornará os valores de um dado depois que ele foi sacudido:
Defina typedef com returnType ( declaração
.h
acima@interface
)Defina a
@property
para o bloco (.h
)Defina um método com
finishBlock
(.h
)Insira o método definido anterior no
.m
arquivo e confirmefinishBlock
com o@property
definido antesPara acionar a
completionBlock
passagem de typeType predefinido (não se esqueça de verificar secompletionBlock
existe)fonte
fonte
Se você precisar trabalhar no Xcode 4.2, também pode @ sintetizar um bloco declarado como uma propriedade, exatamente como faria com uma propriedade que não seja de bloco. Não deixe que a sintaxe do bloco o atinja.
Se a sua propriedade de bloco for esta:
Então o seu @synthesize é o seguinte:
Felicidades.
fonte
@property blockName
não está funcionando. Eu acho que deveria ser@synthesize blockName;
? (para a síntese de um bloco)