如果函数参数中的'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
}
答案 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
是一个类,而sender
是UIButton
的实例变量。因此,您无法通过Class({{1})访问实例变量内部的属性。
如果UIButton
具有静态变量或类函数,则可以使用类(例如UIButton.description())对其进行访问。
也在下面的功能中,
UIButton
func touchDigit(sender: UIButton)
是该函数的参数,而sender
是UIButton
参数的类型。
您可以在此处了解有关Swift函数的更多信息:https://docs.swift.org/swift-book/LanguageGuide/Functions.html