【问题标题】:Objective-C delegate methods with more specific parameter types具有更具体参数类型的 Objective-C 委托方法
【发布时间】:2011-09-08 22:03:31
【问题描述】:

在 Objective-C 中,在委托/协议方法的实现中用更具体的(子类)参数类型替换参数类型是好还是坏?

例如,根据 UIGestureRecognizer 的文档:

调用的操作方法必须符合以下签名之一:

- (void)handleGesture;
- (void)handleGesture:(UIGestureRecognizer *)gestureRecognizer;

当我将 UITapGestureRecognizer 添加到视图时,我知道 handleGesture: 的参数将是 UITapGestureRecognizer 类型(除非稍后添加另一个手势识别器)。是否不赞成将 UIGestureRecognizer 参数替换为 UITapGestureRecognizer 类型的参数?例如:

- (void)handleGesture:(UITapGestureRecognizer *)gestureRecognizer
{
    // 执行
}

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    协议不允许您这样做,因为参数类型是协议规范的一部分。但是您可以并且经常应该使用操作方法来执行此操作。我已经看到了如下所示的操作方法代码:

    - (void)somethingOrOtherAction:(id)sender
    {
        UIButton *button = (UIButton *)sender;
        /* do something with |button| */
    }
    

    此代码仅在发送者是按钮时有效,因此参数的类型没有理由是 UIButton * 以外的任何其他类型。就生成的代码而言,它们都是指向对象的指针,所以一个和另一个一样好。但消除演员表会使代码更清晰,同时也揭示了你的意图。

    在您的情况下反对这一点的一件事是,如果您实际上没有使用UITapGestureRecognizer 提供的任何东西而不是UIGestureRecognizer,那么指定更具体的类型将过度指定参数类型相对于什么代码实际上期望。如果代码实际上可以使用更通用的类型,那么您应该考虑使用更通用的类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      相关资源
      最近更新 更多