我正在编写一款具有可配置的敌人波浪的iOS游戏。我有一个可以配置敌人等的通用波类。
当wave启动时,我希望有一个回调方法来运行每个级别的自定义代码。我一直在阅读这个目标-c没有办法定义内联类或匿名函数,但我真的想避免为我需要使用的每个回调创建一个单独的头/类 - 主要是因为回调只会是几行。
在java中,我这样做:
wave.addCallback( new WaveCallback(){
public void onStart(){
// do some stuff
}
});
在iOS中,我有这个:
Wave *wave1 = [[Wave alloc] init];
[wave1 addEnemy:@"BasicSpaceship"];
// need to tell the wave to execute a few lines of code when started
[waves addObject:wave1];
答案 0 :(得分:1)
在Objective-C中,您将使用许多模式中的一种。 创建一个具有块参数的方法,以便可以向块中添加代码,或者使用委托模式,在其中创建委托协议,并设置实现被调用方法的委托。
两者都在Cocoa中用于回调。 您可以查看两者的示例并确定最适合您的方法。
如果它是带有一些参数的一次性通话,则一个块可以正常工作。如果需要处理大量参数或事件,则可能需要转到委托路径。
您也可以使用NSNotification。当事情发生时,可以发布通知。任何对象都可以注册为观察者并响应通知。 通知可以携带信息的有效载荷。
您可以使用键值观察KVO。这与通知类似,但侧重于属性更改。
答案 1 :(得分:0)
除非我误解了这个问题,否则我会以不同的方式构建你的对象。我会创建一个基本的Wave类,它只是简单地执行你声明的内容。基类具有OnStart
的协议,因此所有子项都需要定义该实现:
@interface Wave1 : Wave
- (void) OnStart;
然后它基本上是你如何定义它:
Wave *wave = [[Wave1 alloc] init];
[wave addEnemy:@"BasicSpaceship"];
[wave OnStart];
[waves addObject:wave];
答案 2 :(得分:0)
- (void) StartWave: (void(^)(void)) onStarted
{
Wave *wave = [[Wave alloc] init];
[wave addEnemy:@"BasicSpaceship"];
[waves addObject:wave];
onStarted();
}
然后你可以像这样调用这个方法:
[self StartWave:^(void){
NSlog(@"I just started wave 1");
}];
[self StartWave:^(void){
NSlog(@"I just started wave 2");
}];
答案 3 :(得分:-1)
评论指向我的代码块,我可以将其传递给wave类的属性: