Objective-C内联类/功能替换

时间:2014-07-05 15:40:09

标签: ios objective-c

我正在编写一款具有可配置的敌人波浪的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];

4 个答案:

答案 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类的属性:

How to store blocks in properties in Objective-C?