Делегаты в Objective-C - это просто концепция, а не какой-то артефакт реализации (как в C #). Делегат в Objective-C (лучше: Какао) - это, по сути, объект, который уведомляется тем, кто использует его в качестве «делегата» определенных событий. Делегатов также могут попросить выполнить определенные задачи от имени хост-объекта. Интерфейс, который необходим для реализации делегата, часто оформляется протоколом.
@protocol ActionDelegate
- (void) actionDidStart: (id) aSender;
- (void) actionDidEnd: (id) aSender;
@end
@interface Action: NSObject {
id<ActionDelegate> delegate;
}
@property (nonatomic,assign) id<ActionDelegate> delegate;
@end
Делегаты в C #, с другой стороны, являются артефактом реализации. Существует специальное ключевое слово delegate
для объявления типов делегатов и для создания реальных экземпляров делегатов.
class Action {
delegate void ActionDidStartDelegate(Action sender);
delegate void ActionDidEndDelegate(Action sender);
...
}
(мой C # немного ржавый, поэтому синтаксис здесь может быть отключен, извините; в реальной жизни, вероятно, будут использоваться события в ситуациях, подобных описанным выше, а не необработанные делегаты). По сути, делегат C # похож на объект метода Python.
Возможно, вы сможете использовать новую функцию блока кода в Objective-C для эмуляции делегатов. Не используя эту функцию (пока), я не могу комментировать это. Еще один способ получить что-то подобное - использовать простые указатели на функции.
typedef void (*callback_function)();
- (void) doSomethingWithCallback: (callback_function) func {
...
func();
}
И, конечно, вы всегда можете использовать метод, часто используемый самим Какао: используйте объект и связанный селектор метода:
- (void) doSomethingWhenDonePerform: (SEL)aSelector onObject: (id) aReceiver {
...
[aReceiver perform: aSelector];
}