我正在尝试了解用于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:) 询问)。