#objective-c #objective-c-blocks
#objective-c #objective-c-блоки
Вопрос:
В соответствии с этим руководством по блочному программированию:
Следующий вложенный блок:
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
с параметрами
и внешняя пустота (^(….)()) ссылается на возвращаемый тип из блока.
Собрав все это вместе, вы получите исходное объявление.