Объявление и создание блоков
Объявление блочной ссылки
Основные переменные содержат ссылки на блоки. Вы объявляете их использующий синтаксис, подобный этому, Вы используете для объявления указателя на функцию, за исключением того, что Вы используете ^
вместо *
. Тип блока полностью взаимодействует с остальной частью системы типов C. Следующее является всеми допустимыми объявлениями основной переменной:
void (^blockReturningVoidWithVoidArgument)(void); |
int (^blockReturningIntWithIntAndCharArguments)(int, char); |
void (^arrayOfTenBlocksReturningVoidWithIntArgument[10])(int); |
Блоки также поддерживают variadic (...
) параметры. Блок, не берущий параметров, должен указать void
в списке аргументов.
Блоки разработаны, чтобы быть полностью безопасными с точки зрения типов путем предоставления компилятору полного набора метаданных для использования для проверки использования блоков, параметры передали блокам и присвоению возвращаемого значения. Можно бросить блочную ссылку на указатель произвольного типа и наоборот. Вы не можете, однако, разыменовать блочную ссылку через указатель, разыменовывают оператора (*
) — таким образом размер блока не может быть вычислен во время компиляции.
Можно также создать типы для блоков — выполнение также - обычно считается наиболее успешной практикой при использовании блока с данной подписью в многократных местах:
typedef float (^MyBlockType)(float, float); |
MyBlockType myFirstBlock = // ... ; |
MyBlockType mySecondBlock = // ... ; |
Создание блока
Вы используете ^
оператор для указания начала блочного литерала. Это может сопровождаться списком аргументов, содержавшим в ()
. Организация блока содержится в {}
. Следующий пример определяет простой блок и присваивает его ранее заявленной переменной (oneFrom
) — здесь блок сопровождается нормальным ;
это заканчивает оператор C.
float (^oneFrom)(float); |
oneFrom = ^(float aFloat) { |
float result = aFloat - 1.0; |
return result; |
}; |
Если Вы явно не объявляете возвращаемое значение блочного выражения, оно может быть автоматически выведено из содержания блока. Если тип возврата выведен, и список параметров void
, тогда можно опустить (void)
список параметров также. Если или когда многократные операторы возврата присутствуют, они должны точно соответствовать (использующий кастинг если необходимый).
Глобальные блоки
На уровне файла можно использовать блок в качестве глобального литерала:
#import <stdio.h> |
int GlobalInt = 0; |
int (^getGlobalInt)(void) = ^{ return GlobalInt; }; |