Objective C обратные вызовы с блоками

Я рассмотрел различные ответы на SO для этого, но не могу понять, как все это на самом деле работает.

У меня есть GameEngine, который содержит сенсорные элементы. Я хочу, чтобы при касании элемента он запускал событие "Я был тронут", которое GameEngine прослушивает и обрабатывает соответствующим образом.

В C# я бы делал это с делегатами / событиями, но, похоже, не могу найти достойный эквивалент объекта, который использует блоки. - Я хочу использовать блоки, так как это больше похоже на анонимные функции в C#, к которым я привык.

В C# я бы просто сделал что-то вроде следующего, в цели c кажется, что мне нужно написать страницу кода, чтобы заставить работать то же самое?

touchableObject.touched += (o) => { handler code yay }

Редактировать на основе ответа Дрииса:

декларация

typedef void (^CircleTouchedHandler)(id parameter);

@interface CircleView : UIView{
}

@property CircleTouchedHandler Touched;

Как это назвать и передать себя в качестве параметра?

[self Touched(self)]; // this doesnt work

1 ответ

Решение

В Objective-C это будет выглядеть примерно так:

touchableObject.touched = ^(id o) { /* handler code */ };

Предполагается, что touch является свойством подходящего типа блока. Если вы повторно используете тип блока (например, Func в C#), имеет смысл ввести его по умолчанию, поскольку объявление блока в ObjC, как правило, становится трудным для чтения очень быстро.

Синтаксис блока получает некоторое время для привыкания в Objective-C, когда вы переходите с другого языка с немного более элегантным синтаксисом блока / лямбды. Чтобы узнать и как ссылку, посмотрите этот предыдущий ответ, который мне очень помог.

Чтобы определить тип для touch, вы должны использовать что-то вроде:

typedef void (^Handler)(id parameter);

Затем просто объявите свойство прикосновения как обработчик типа.

Другие вопросы по тегам