为什么IBAction类型默认为AnyObject?

时间:2015-12-29 00:26:57

标签: ios xcode swift macos cocoa

每当我创建一个IBAction时,我总是要将AnyObject的默认Type(sender)设置为唯一的另一个选项,即实际的类类型。

它是否有理由始终默认为AnyObject而不是我明确添加的对象?

我相信我理解UIObject和AnyObject之间的区别,但我不明白为什么AnyObject应该是默认值。

2 个答案:

答案 0 :(得分:4)

实际上,您可以将IBAction设置为该对象层次结构中的任何类。例如,如果您有一个名为YellowButton的类是UIButton的子类,那么您可以在AnyObjectUIButton和{{1}之间进行选择}。

要考虑的另一件事是,您可以将许多对象附加到同一YellowButton。他们甚至不需要属于同一类型。例如,您可以将IBActionUIBarButtonItem连接到同一UIButton。只有在发件人类型设置为IBAction时才能执行此操作。

现在,为什么Apple选择AnyObject作为我只能猜测的默认值。我认为这是因为您可以在方法中输入发送者,而不会丢失任何信息。这样,您甚至可以根据发件人的班级采取不同的行动。

答案 1 :(得分:4)

我能想到的一个原因是让我说我​​首先编写一个对象的接口,但我还不知道什么控件类型会调用该动作。或者更进一步,我最终得到了一种以上的控制。

通过默认为AnyObject,它非常适合objc id类型。它也是可扩展的,适用于一般情况。

它也是Target-Action的一部分,因此只有某些方法签名才能实现。

这个摘录提供了一个很好的方案 -

  

senderparameter通常标识发送操作消息的控件(尽管它可以是由实际发件人替换的另一个对象)。这背后的想法类似于明信片上的回邮地址。如果需要,目标可以查询发件人以获取更多信息。如果实际发送对象将另一个对象替换为发送方,则应以相同方式处理该对象。例如,假设您有一个文本字段,当用户输入文本时,将在目标中调用操作方法nameEntered:

- (void)nameEntered:(id) sender {
NSString *name = [sender stringValue];
if (![name isEqualToString:@""]) {
    NSMutableArray *names = [self nameList];
    [names addObject:name];
    [sender setStringValue:@""];
}
}
  

此处,响应方法提取文本字段的内容,将字符串添加到作为实例变量缓存的数组,并清除该字段。对发送方的其他可能的查询是向NSMatrix对象询问其所选行([sender selectedRow]),向NSButton对象询问其状态([sender state]),并询问与控件关联的任何单元格的标签([ [sender cell] tag]),标签是数字标识符

默认为id / AnyObject是有意义的,因为您可以随时更改它以确保更好的类型安全。