Вам не хватает фундаментальных знаний о 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
}
}
Надеюсь, это кое-что прояснит для вас.