Ios 在Swift 3.0中,如何检查按下的按钮

Ios 在Swift 3.0中,如何检查按下的按钮,ios,swift3,uibutton,sender,Ios,Swift3,Uibutton,Sender,我知道下面将返回被按下按钮的标题 let myString = sender.title(for: .normal)! 但我真的很想理解为什么这是可行的。我在苹果里找不到它 我在另一个线程中读到,sender是Any类型的参数,而不是UIButton,但我希望您能帮助我破译此语法。您可以在方法名称中看到sender的类型。您发布的代码仅在发件人是ui按钮时有效,如下所示: @IBAction func sampleMethod(_ sender: UIButton) { let myS

我知道下面将返回被按下按钮的标题

let myString = sender.title(for: .normal)!
但我真的很想理解为什么这是可行的。我在苹果里找不到它


我在另一个线程中读到,
sender
Any
类型的参数,而不是UIButton,但我希望您能帮助我破译此语法。

您可以在方法名称中看到
sender
的类型。您发布的代码仅在发件人是
ui按钮时有效,如下所示:

@IBAction func sampleMethod(_ sender: UIButton) {
    let myString = sender.title(for: .normal)
}
如果
sender
类型为
Any
,则必须将其作为
ui按钮展开,以便以相同的方式访问标题,如下所示:

@IBAction func sampleMethod(_ sender: Any) {
    if let sender = sender as? UIButton {
        let myString = sender.title(for: .normal)
    }
}
如果不这样做,应用程序将无法编译。类型
Any
没有
title
属性

如果通过从情节提要拖动到代码来创建
iAction
函数,则默认情况下,发送者类型为
Any
,如下所示:

您可以使用类型旁边的下拉菜单将其设置为
ui按钮
,如下所示:

@IBAction func sampleMethod(_ sender: Any) {
    if let sender = sender as? UIButton {
        let myString = sender.title(for: .normal)
    }
}

类的文档中描述了目标操作机制,该类是可操作控件(如
ui按钮
)继承自的类

本质上,操作函数必须实现以下签名之一:

  • doSomething()
  • doSomething(uu发送方:任意)
  • doSomething(uu发送方:任意,事件:UIEvent)
sender
参数将是发送操作的控件

Swift中的
Any
是一种特殊类型,可以表示任何类型,但它不是实际类型,因此,如果发送方是
UIButton
,则
sender
将是
UIButton
的一个实例,但除非将其向下转换,否则无法访问它的任何特定方法或属性。你可以这样说:

func doSomething(_ sender: Any) {
    if let button = sender as? UIButton {
          let myString = button(for: .normal)
}
但是,通常您知道如何连接控件和操作处理程序,因此不需要有条件地向下转换;您可以使用显式向下广播:

func doSomething(_ sender: Any) {
    let button = sender as! UIButton 
    let myString = button(for: .normal)
}
或者,更简洁地说:

func doSomething(_ sender: UIButton) {
    let myString = button(for: .normal)
}
现在,如果您错误地将
doSomething
连接到文本字段上的某个操作,则最后两种形式会在向下播放失败时导致运行时崩溃;但希望您在测试过程中发现这一点,因此通常认为这样做是“安全的”

这也会起作用。(如果您不知道发件人的类型)

但按钮最常用的方式是

let string = (sender as! UIButton).title(for: .normal)
print(str!)

通常,此方法由系统调用,按钮的实例作为参数传递。这就是为什么在方法中,您可以获得按钮。编译器不允许您在
AnyOnject
上调用
title(for:)