Концепция лямбды в Objective-C теперь заключена в идею блоков , которые эквивалентны функциям передачи по ссылке. Конечно, возможно, это уже было в C с идеей указателей на функции; блоки - это просто способ захвата локального состояния (т. е. могут быть замыкания). Фактически, блоки могут также использоваться в других языках C (на Mac) - есть предложение сделать их частью стандартного синтаксиса C.
Вот пример определения лямбды для умножения двух чисел:
int (^mult)(int, int) = ^(int a, int b) { return a*b; };
Первая часть объявляет переменную типа ^int(int,int)
, а затем присваивает ее лямбда-выражению (так называемому блоку), которое возвращает кратное двух ее аргументов. Затем вы можете передать этот fn, определить его в других местах и т. Д .; Вы даже можете использовать его в других функциях.
Вот пример определения функции, которая при вызове возвращает другую функцию:
multiplyBy = ^(int a) { return ^(int b) { return b*a; }; };
triple = multiplyBy(3);
Обратите внимание, что вы можете смешивать блоки с типами объектов (обычно используя id
в качестве типа объекта), и многие из новых структур данных объектов Objective-C имеют своего рода операции на уровне блоков. GCD также использует блоки для передачи произвольных событий; однако учтите, что GCD также можно использовать с указателями функций.