类型“UIButton”没有成员“发件人”

Posted

技术标签:

【中文标题】类型“UIButton”没有成员“发件人”【英文标题】:Type 'UIButton' has no member 'sender' 【发布时间】:2018-11-07 08:43:39 【问题描述】:

如果'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

【问题讨论】:

let digit = sender.currentTitle! 最有可能......但这里展开的力量仍然让我扬起眉毛。 谢谢!为避免强制解包,这会是使用可选绑定的情况吗?我听说如果可以保证在某个时候设置某些东西,那么强制展开可能会很好,尽管正如你所暗示的那样有风险。 【参考方案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
    

我希望这可以为您解决一些问题。

【讨论】:

这太好了,谢谢!此外,在“if let button = sender as?UIButton”这一行上,可以“as!”或者在将 sender 转换为 UIButton 时使用? @JCoder 否。您将收到编译时错误,因为表达式不是可选的。所以明确的区别是:let button: UIButton? = sender as? UIButtonlet button: UIButton = sender as! UIButton。由于第二个不是可选的(没有?),您不能继续使用if let button = button【参考方案2】:

UIButton 是一个类,senderUIButton 的实例变量。所以你不能通过 Class(UIButton) 访问实例变量中的属性。

如果UIButton 有静态变量或类函数,您可以使用类访问它(例如:UIButton.description())。

也在下面的函数中,

func touchDigit(sender: UIButton)

sender是函数的参数,UIButtonsender参数的类型。

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

【讨论】:

以上是关于类型“UIButton”没有成员“发件人”的主要内容,如果未能解决你的问题,请参考以下文章

使用发件人标签在 UIbutton 单击事件时更新 UITableViewCell 的标签

在发件人中使用带有 UIButton 的标签属性并尝试强制转换 id -> UIButton

如何将(id)发件人添加到以下-(IBAction)?

我如何从发件人那里获取标签值

UITablewView 和 IBAction 发件人的问题

解析服务器:找不到推送类型 android 的发件人