Программирование с вложенными блоками

#objective-c #objective-c-blocks

#objective-c #objective-c-блоки

Вопрос:

В соответствии с этим руководством по блочному программированию:

http://thirdcog.eu/pwcblocks/

Следующий вложенный блок:

 void (^(^myblockptr)(void (^)()))();
 

Является указателем на блок, возвращающий блок, принимающий блок

В нем говорится, что это эквивалентно:

 typedef void (^Block)();
Block (^myblockptr)(Block);
 

Я предполагаю, что это (void (^)()) соответствует параметрам, (Block) т.е. . Однако я не могу увидеть, какая часть вложенного выражения соответствует возвращаемому блоку.

Можете ли вы идентифицировать возвращаемый блок во вложенном выражении?

Комментарии:

1. объявить myblockptr как блок (блок, возвращающий пустоту), возвращающий блок, возвращающий пустоту

Ответ №1:

Как сказал Джошуа, при анализе объявлений C рекомендуется начинать изнутри.

 void (^(^myblockptr)(void (^)()))();
 

Поскольку myblockptr это переменная, давайте разделим объявление на две части: слева от переменной и справа от переменной:

 void (^(^myblockptr)    (void (^)()))();
 

Мы знаем, что (^myblockptr) это блок из-за ^ , поэтому слева от него мы должны найти его возвращаемый тип, а справа от него мы должны найти его типы параметров.

Давайте проанализируем параметры, которые myblockptr требуется, двигаясь вправо. Они должны быть сгруппированы в круглые скобки сразу после (^myblockptr) :

 void (^(^myblockptr)    (void (^)())    )();
 

Это единственный параметр, который является блоком из-за ^ :

 void (^)()
 

и теперь легко видеть, что параметр представляет собой блок, который возвращает void и не принимает никаких параметров.

Двигаясь дальше вправо, мы видим закрывающую скобку, поэтому нам нужно проанализировать крайнюю левую часть:

 void (^    (^myblockptr)…
 

где мы видим, что myblockptr возвращает блок, который возвращает void . Поскольку он возвращает блок, мы должны найти типы параметров, принятые возвращаемым блоком после закрывающей круглой скобки, которая соответствует самой левой открывающей парантезе:

 void (^    (^myblockptr)(void (^)())    )();
 

поскольку это так () , мы видим, что возвращаемый блок не имеет никаких параметров.

введите описание изображения здесь

Вкратце: myblockptr это блок, который (справа) принимает параметр, который является блоком, который не принимает параметров и возвращает void , и (слева) возвращает блок, который не принимает параметров и возвращает void . Поскольку возвращаемый тип myblockptr и (одиночный) тип параметра одинаковы:

 typedef void (^Block)();
 

что приводит к:

 Block (^myblockptr)(Block);
 

Возможно, вам захочется прочитать объявления типа C для чтения Стива и, как упоминал Джереми, Фиш cdecl.org .

Ответ №2:

Вы должны прочитать определение блока изнутри.

Давайте разберем это.

void (^(^myblockptr)(void (^)()))();

void (^)() объявляет блок, который является параметром

RETURNTYPE (^myblockptr)(PARAMS) объявляет блок с именем myblockptr с параметрами

и внешняя пустота (^(….)()) ссылается на возвращаемый тип из блока.

Собрав все это вместе, вы получите исходное объявление.