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);
Затем просто объявите свойство прикосновения как обработчик типа.