Swift无法通过IBAction连接多个按钮" Any"但是可以通过" AnyObject"

时间:2016-11-25 08:54:59

标签: swift xcode swift3

我正在使用9个按钮构建应用程序。我试图将它连接到下面的一个IBaction,这不起作用(在助理编辑器中没有UI更新,让我连接按钮和这个IBAction代码块)。

@IBAction func buttonPressed(_ sender: Any) {

    print("ButtonPressed")

}

enter image description here

然而它适用于" AnyObject"发件人之后。

    @IBAction func buttonPressed(_ sender: AnyObject) {

    print("ButtonPressed")

}

enter image description here

问题1,为什么会出现这种情况?

问题2,Swift中Any和AnyObject有什么区别?

基于swift_documentation任何允许各种类型的对象,而 anyObject 只允许相同类型的对象。在这种情况下,我认为这意味着发件人对象必须与任何属于同一类型。

这是否意味着只允许相同类型的按钮连接多个按钮,因此只有 anyObject 有效?

2 个答案:

答案 0 :(得分:1)

最后的事情:)

差异

如果您查看The Swift Programming LanguageAnyAnyObject的说明,您会找到此说明:

  
      
  • 任何可以表示任何类型的实例,包括函数类型。

  •   
  • AnyObject可以表示任何类类型的实例。

  •   

为什么会出现这种行为

我在这里猜测,但@IBAction是Apple用于在应用的不同元素之间进行通信的Target-Action模式的一部分(目标知道如何与行动相关)。由于这种模式早于Swift,我猜测一个动作的sender必须是一个可以工作的类。在Objective C中,您将使用id,意思是"任何类",并且在Swift中 - 正如我们刚刚发现的那样 - 表示"可以是类型的东西任何课程#34;是AnyObject

希望这有意义并帮助你。

答案 1 :(得分:0)

在Swift 3中,Objective-C中相当于id的内容已从AnyObject更改为Any

但是,根据定义,所有UI元素都是对象,目标/操作模式需要AnyObject

如果IBAction的发件人属于同一类(或子类),您甚至可以将sender指定为该类,例如:

@IBAction func buttonPressed(_ sender: UIButton)