Тип «UIButton» не имеет члена «отправитель» - PullRequest
0 голосов
/ 07 ноября 2018

Если 'sender' имеет тип UIButton в аргументе функции, почему нельзя явно показать, что он наследуется от класса UIButton с помощью оператора точки? Это как-то связано с функцией вывода типов в Swift, или в этой ситуации неправильно вводить UIButton.sender? Я новичок в ООП и до сих пор выясняю, как свойства наследуются от классов (например, UIButton) в Swift.

@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 голосов
/ 07 ноября 2018

Вам не хватает фундаментальных знаний о 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
    }
}

Надеюсь, это кое-что прояснит для вас.

0 голосов
/ 07 ноября 2018

UIButton является классом, а sender является переменной экземпляра UIButton. Таким образом, вы не можете получить доступ к свойствам внутри переменной экземпляра через класс (UIButton).

Если UIButton имеет статические переменные или функции класса, вы можете получить к ним доступ, используя класс (например: UIButton.description ()).

Также в функции ниже,

func touchDigit(sender: UIButton)

sender является параметром функции, а UIButton является типом sender параметра.

Подробнее о функциях Swift вы можете узнать здесь: https://docs.swift.org/swift-book/LanguageGuide/Functions.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...