【问题标题】:Why do IBAction types default to AnyObject?为什么 IBAction 类型默认为 AnyObject?
【发布时间】:2015-12-29 00:26:57
【问题描述】:

每当我创建 IBAction 时,我总是必须将默认类型(发送方)从 AnyObject 设置为唯一的其他选项,即实际的类类型。

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

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

【问题讨论】:

标签: ios xcode swift macos cocoa


【解决方案1】:

我能想到的一个原因是假设我首先编写了一个对象的接口,但我还不知道哪种控件类型会调用该操作。或者更进一步,我最终得到了不止一种类型的控制。

默认为 AnyObject 它非常适合 objc id 类型。它还具有可扩展性,适用于一般情况。

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

这段摘录给出了一个很好的场景-

sender 参数通常标识发送动作消息的控件(尽管它可以是由实际发送者替代的另一个对象)。这背后的想法类似于明信片上的寄信人地址。如果需要,目标可以向发送者查询更多信息。如果实际的发送对象替换为另一个对象作为发送者,你应该以同样的方式对待那个对象。例如,假设您有一个文本字段,当用户输入文本时,将在目标中调用操作方法 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 是有意义的,因为您可以随时更改它以确保更好的类型安全性。

【讨论】:

    【解决方案2】:

    实际上,您可以将IBAction 设置为该对象层次结构中的任何类。例如,如果您有一个名为 YellowButton 的类,它是 UIButton 的子类,您将能够在 AnyObjectUIButtonYellowButton 之间进行选择。

    要考虑的另一件事是,您可以将许多对象附加到同一个IBAction。他们甚至不需要是同一类型。例如,您可以将UIBarButtonItemUIButton 连接到同一个IBAction。仅当发件人类型设置为 AnyObject 时才能执行此操作。

    现在,我只能猜测为什么 Apple 选择 AnyObject 作为默认设置。我认为这是因为您可以在您的方法中键入 cast the sender 而不会丢失任何信息。这样,您甚至可以根据发件人的类别采取不同的操作。

    【讨论】:

      猜你喜欢
      • 2014-11-17
      • 1970-01-01
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 2021-06-24
      • 1970-01-01
      • 2016-10-26
      • 1970-01-01
      相关资源
      最近更新 更多