while structures sintaxis endif else control anidados objective-c objective-c-blocks

objective-c - structures - si php



Sintaxis alternativa a__block (2)

El | | la sintaxis se inspiró en Smalltalk, al igual que, por supuesto, el término "bloque".

Como señala bbum, marcar el sitio decl es más honesto que el uso sin bloque y mucho más en línea con C cuando se modela, como terminó, como un nuevo objeto (C) de "duración".

http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1451.pdf

Tengo una pregunta sobre la sintaxis de __block variables __block . Sé que puedes usar __block en una variable en el alcance para que no sea de solo lectura dentro del bloque. Sin embargo, en un punto de los documentos de Apple , vi una alternativa:

"Las variables en el ámbito de definición son de solo lectura por defecto cuando se usan en un bloque. Si necesita cambiar el valor de dicha variable, puede usar una sintaxis especial:

int count = 0; float cumulativeValue = 0.0; UpdateElements( a, N, ^(float element){ |count, cumulativeValue| float value = factor * element; ++count; cumulativeValue += value; return value; } );

En este ejemplo, count y cumulativeValue se modifican dentro del bloque, por lo que se incluyen en la lista de variables compartidas separadas por comas al principio del alcance del bloque.

Esta sintaxis parece mucho más limpia y supongo que entonces podría modificar las variables que no declaró pero que aún están dentro del alcance. Sin embargo, no he visto esto en ningún otro lado y al compilador xCode no le gusta mi bloque básico. ¿Es esta sintaxis legítima?


Guau. No he visto esa sintaxis en mucho tiempo.

Esa fue una de las diversas estructuras sintácticas exploradas durante el desarrollo de bloques. Finalmente fue rechazado porque era demasiado impreciso para declarar la intención y el comportamiento resultante habría sido confuso.

Considere un alcance con tres bloques, dos de los cuales declaran una variable como readwrite a través de |a| . No habría forma de saber del int a = 5; declaración en la parte superior del alcance que el valor de la variable es readwrite en algunos de los alcances del bloque.

Además, haría la implementación del compilador mucho más difícil. La tradición en C es que un tipo de almacenamiento de variables se fija en el momento de la declaración. Apoyar esta sintaxis habría roto esa expectativa.

Por lo tanto, se decidió usar un modificador de tipo de almacenamiento similar a volatile o static . __block se usó principalmente porque el prefijo __ reduce en gran medida la cantidad de código que se rompería al agregar una palabra clave desnuda.

Gracias por preguntar esto. Error archivado y esa documentación será arreglada y / o eliminada eventualmente.