La sintaxis de bloque en el Objetivo C (y de hecho C, supongo) es notoriamente incongruente. Pasar bloques como argumentos se ve diferente a declarar bloques como ivars, que se ven diferentes a typedef
los bloques ing.
¿Existe una lista completa de sintaxis de declaración de bloque que pueda tener a mano para una referencia rápida?
objective-c
syntax
objective-c-blocks
Patrick Perini
fuente
fuente
Respuestas:
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únmentevoid
)blockName
ser el nombre variable del bloque que estás creandovar_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 dadoY recuerde que puede crear tantos parámetros como desee.
Bloques como variables
Posiblemente el más común para la declaración.
Bloques como propiedades
Al igual que declarar bloques como variables, aunque sutilmente diferentes.
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.
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.
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.
typedef
BloquearEsto le permite configurar un nombre corto al que se puede hacer referencia como cualquier otro nombre de clase durante la declaración de bloques.
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.
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.
Bloques de retorno
Un método puede devolver un bloque,
como puede una función, aunque sea un poco extraño.
Addendums
Si me he perdido algo, hágamelo saber en los comentarios y lo investigaré / agregaré.
Ah, y en Swift ...
Es casi como si fuera una característica del lenguaje.
fuente
BlockType ^blockVar = Anonymous Block
muestra error de sintaxis, sin ^ también :(Personalmente me gusta usar este sitio web ( http://fuckingblocksyntax.com ). El nombre es más fácil de recordar que la sintaxis del bloque en sí:
http://fuckingblocksyntax.com
y si no puede cargar URL con malas palabras, puede usar este espejo: http://goshdarnblocksyntax.com
fuente
Typedef:
En línea:
Método:
fuente
La biblioteca de fragmentos Xcode 4 contiene plantillas para los tipos de bloques y los bloques en línea como variables. También están disponibles mediante autocompletado (
typedefblock
yinlineblock
).Para bloques como argumentos de métodos, recomendaría declarar ay
typedef
luego simplemente usar eso. Hace que el código sea mucho más fácil de leer.fuente
Escribí un Bloque de finalización para una clase que devolverá los valores de un dado después de haberlos sacudido:
Definir typedef con returnType ( declaración
.h
anterior@interface
)Definir a
@property
para el bloque (.h
)Definir un método con
finishBlock
(.h
)Insertar método definido previa en
.m
el archivo y se comprometanfinishBlock
a@property
definir antesPara activar el
completionBlock
paso variableType predefinido (no olvide comprobar sicompletionBlock
existe)fuente
fuente
Si necesita volver a trabajar en Xcode 4.2, también puede @ sintetizar un bloque declarado como una propiedad tal como lo haría con una propiedad que no sea de bloque. No dejes que la sintaxis de bloque te arroje.
Si su propiedad de bloque es esta:
Entonces tu @synthesize es este:
Salud.
fuente
@property blockName
No funciona. Creo que debería ser@synthesize blockName;
? (para sintetizar un bloque)