首页 > 解决方案 > 类型“UIButton”没有成员“发件人”

问题描述

如果'sender'在函数的参数中是 UIButton 类型,为什么不能显式显示它使用点运算符从 UIButton 类继承?它是否与 Swift 的类型推断功能有关,或者在这种情况下键入 'UIButton.sender' 是错误的?我是 OOP 的新手,并且仍在弄清楚属性如何从 Swift 中的类(例如 UIButton)继承。

@IBAction private func touchDigit(sender: UIButton) {
    let digit = UIButton.sender.currentTitle!  // ERROR unless UIButton is removed
    if userIsInTheMiddleOfTyping {
        let textCurrentlyInDisplay = display.text!
        display.text = textCurrentlyInDisplay + digit
    } else {
        display.text = digit
    }
    userIsInTheMiddleOfTyping = true
}

标签: iosswiftxcodeuibutton

解决方案


您缺少一些有关 swift 的基本知识。您的情况下的点运算符不会“明确显示为从 UIButton 类继承”。点运算符可以访问类中的属性、方法或嵌入元素。

如果您希望您的代码UIButton.sender工作,您可以编写如下内容:

extension UIButton {
    static var sender: UIButton { return UIButton() }
}

并不是说这有任何意义。它会让你的代码工作,但它会生成一个新按钮,与你的sender.

您的情况下的继承已经在方法参数中明确完成,touchDigit(sender: UIButton)但也可以通过编写touchDigit(sender: Any). 现在在这种情况下sender可能是任何事情。要使用它,UIButton您需要像这样进行类型转换sender as! UIButton

@IBAction private func touchDigit(sender: Any) {
    let digit = (sender as! UIButton).currentTitle!  

如果你用按钮以外的任何东西调用它,这可能会崩溃,例如,如果你这样做了:

func doSomething() {
    self.touchDigit(sender: "some text")
}

@IBAction private func touchDigit(sender: Any) {
    let digit = (sender as! UIButton).currentTitle!  

由于发件人doSomething不是. 因此,在这种情况下您要做的是检查以下类型:(sender as! UIButton)UIButton

func doSomething() {
    self.touchDigit(sender: "some text")
}

@IBAction private func touchDigit(sender: Any) {
    if let button = sender as? UIButton {
        let digit = button.currentTitle!
            if userIsInTheMiddleOfTyping {
                let textCurrentlyInDisplay = display.text!
                display.text = textCurrentlyInDisplay + digit
            } else {
                display.text = digit
            }
            userIsInTheMiddleOfTyping = true
        }
    } else if let text = sender as? String {
        display.text = text
    }
}

我希望这能为你清除一些事情。


推荐阅读