【问题标题】:Objective-C inline class/function replacementObjective-C 内联类/函数替换
【发布时间】:2014-07-05 15:40:09
【问题描述】:

我正在编写一个具有可配置敌人波的 iOS 游戏。我有一个可以配置敌人等的通用波类。

当一波开始时,我想要一个回调方法来运行每个级别的自定义代码。我一直在阅读objective-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];

【问题讨论】:

  • 您不能为此使用代码块吗?从您在 java 中所做的判断来看,我认为代码块可以很好地满足您的需求。
  • 也许你想看看块。
  • obj-c 对我来说还是个新手,听起来我需要研究代码块。
  • 您希望在配置Wave 的对象上运行代码还是运行独立于执行此操作的对象的代码?
  • 我想把代码传给wave1,这样当wave真正启动时,它就可以执行代码块了

标签: ios objective-c


【解决方案1】:

在 Objective-C 中,您可以使用多种模式中的一种。 要么创建一个具有块参数的方法,这样您就可以将代码添加到块中,或者使用委托模式,您可以在其中创建一个委托协议,并设置一个实现被调用方法的委托。

两者都在 Cocoa 中用于回调。 您最好查看两者的示例并确定最适合您的方法。

如果它是带有几个参数的一次性调用,则块将起作用。如果您需要处理大量参数或事件,您可能需要使用委托路线。

您也可以使用 NSNotification。发生事情时可以发布通知。任何对象都可以注册为观察者并响应通知。 通知可以携带或不携带信息的有效载荷。

您可以使用键值观察 KVO。这类似于通知,但侧重于属性更改。

【讨论】:

    【解决方案2】:

    除非我误解了这个问题,否则我会以不同的方式构建您的对象。我将创建一个基本 Wave 类,它只执行您声明的操作。基类有一个OnStart 的协议,因此所有子类都需要定义该实现:

    @interface Wave1 : Wave
    
    - (void) OnStart;
    

    然后基本上就是你上面定义的方式:

    Wave *wave = [[Wave1 alloc] init];
    [wave addEnemy:@"BasicSpaceship"];
    [wave OnStart];
    [waves addObject:wave];
    

    【讨论】:

    • 但我不希望每一波都有一个子类,这就是我要避免的。只是定义几行代码以在 wave 开始时执行的简单方法。
    【解决方案3】:
    - (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");
    }];
    

    【讨论】:

      【解决方案4】:

      评论将我指向代码块,我可以将其传递给 wave 类的属性:

      How to store blocks in properties in Objective-C?

      【讨论】:

      • 您也可以使用委托和操作目标。
      • 块不必存储为属性。它们也可以简单地内联编写。
      • 但是 inline 对我没有帮助,因为它需要稍后执行
      • 为什么不将它添加到数组中?
      • 内联块稍后执行。当您将块传递给函数时(类似于 Java 中的匿名类),被调用方法负责在需要时执行您的块。传递给方法的内联块可能永远不会被执行。
      猜你喜欢
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-05
      相关资源
      最近更新 更多