Символ каретки между типами, а не переменными, заключенный в скобки - PullRequest
2 голосов
/ 20 июня 2010

Я просматривал документацию Apple и увидел что-то вроде (void (^)(void)).Может кто-нибудь объяснить, что означает это утверждение?^ это XOR, верно?void XOR void не имеет для меня особого смысла?

Было также что-то вроде (void (^)(BOOL finished))

Ответы [ 2 ]

13 голосов
/ 20 июня 2010

Это блоки, которые добавляют анонимные функции и функциональные объекты в Objective-C. Смотрите, например Представляем блоки и Grand Central Dispatch :

Блочные объекты (неофициально, «блоки») являются расширением C, а также Objective-C и C ++, которые позволяют программистам определять автономные единицы работы. Блоки похожи - но гораздо более мощны, чем - традиционные указатели функций. Ключевые различия:

  • Блоки могут быть встроены как «анонимные функции».
  • Блоки захватывают копии локальных переменных только для чтения, аналогично «замыканиям» в других языках

Объявление переменной блока:

void (^my_block)(void);

Назначение ему блочного объекта:

my_block = ^(void){ printf("hello world\n"); };

Вызов:

my_block(); // prints “hello world\n”

Принятие блока в качестве аргумента:

- (void)doSomething:(void (^)(void))block;

Использование этого метода со встроенным блоком:

[obj doSomeThing:^(void){ printf("block was called"); }];
1 голос
/ 20 июня 2010

Это блок , специфичное для Apple расширение C, похожее на указатели функций или функциональные объекты в других языках.

(void (^)(void)) выглядит как приведение типа к типублок, который не принимает параметров и ничего не возвращает.Точно так же, (void (^)(BOOL finished)) выглядит как другой тип, для блока с одним логическим параметром и ничего не возвращает.

...