目标 c - 为什么是 (id)sender 而不是 (UIButton *)sender



我正在尝试了解用于iPhone开发的Objective-C,在浏览有关操作的示例时,我经常看到以下内容:

- (IBAction)sliderMoved:(id)sender
{
    UISlider *aSlider = (UISlider *)sender;
    //rest of code goes here...
}

接收类型 (id) 然后立即将其转换为 (UISlider *) 的目的是什么?为什么不只具备以下几点:

- (IBAction)sliderMoved:(UISlider *)aSlider;
{
    //rest of code goes here...
}

这是否有技术原因,或者只是约定俗成,还是为了可读性而这样做?

提前感谢,

  • 蒂莫
我相信

这是一个惯例,源于这样一个事实,即UIControl到IBAction并不总是1:1的映射。例如,您可以将 UISwitch、UIButton 和 UITextField 全部映射到- (IBAction)syncUI:(id)sender;方法。在这种情况下,无法指定类型。

承认这只是我自己的心理理由,如果可以的话,当然没有什么能阻止你在发件人的类型上更明确。我通常是。

事实上,如果需要,并且绝对确定该操作永远不会由任何其他类型的对象触发,则可以将发送方指定为UIButton*。如果操作取决于发件人是特定类型,这甚至可能是合适的。但是,通常,发送方的类型对控制器无关紧要,将其指定为 id 使您可以灵活地更改视图,而无需修改控制器。

即使

你知道你总是在应用中使用按钮来执行相关操作,你可能想要这种灵活性的一个原因是,它使单元测试变得更加容易。

IBActions通常是泛型的,可以由任何类触发,因此id类型。如果您需要在方法中强制转换 sender 变量,那么显然您关心 sender 的类,因此您应该更改方法签名以反映这一点。

id

抽象数据类型。如果你的方法可以从多个位置、由另一个对象、通过按钮等调用,那么你可能并不总是知道发送方法调用的对象类型。我认为这主要是惯例,如果您要轮询发送者以获取数据,您必须知道它可以响应哪些方法(如果没有,您可以使用 respondsToSelector:) 询问)。

最新更新