类型“ UIButton”没有成员“发送者”

时间:2018-11-07 08:43:40

标签: ios swift xcode 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
}

2 个答案:

答案 0 :(得分:1)

您缺少有关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
    }
}

我希望这可以为您清除一些东西。

答案 1 :(得分:0)

UIButton是一个类,而senderUIButton的实例变量。因此,您无法通过Class({{1})访问实例变量内部的属性。

如果UIButton具有静态变量或类函数,则可以使用类(例如UIButton.description())对其进行访问。

也在下面的功能中,

UIButton

func touchDigit(sender: UIButton) 是该函数的参数,而senderUIButton参数的类型。

您可以在此处了解有关Swift函数的更多信息:https://docs.swift.org/swift-book/LanguageGuide/Functions.html