Быстрый Keypath с UIB-кнопками - PullRequest
2 голосов
/ 08 июля 2019

Я пытаюсь получить путь к выбранному свойству IBOutlet в классе.Но получите: Type 'UIButton?' has no member 'isSelected'

прямой доступ к UIButton.isSelected ключевому пути работает, но не выполняет мой сценарий использования.

@objc class Demo: UIViewController{
    @IBOutlet @objc dynamic weak var button: UIButton!
}

var demo = Demo()

print(#keyPath(UIButton.isSelected)) // no error
print(#keyPath(Demo.button.isSelected)) // error
print(#keyPath(demo.button.isSelected)) // error

что мне не хватает?

1 Ответ

2 голосов
/ 08 июля 2019

#keyPath - это просто синтаксический сахар, который создает строковое значение, при этом гарантируя, что keyPath действителен для указанного вами объекта; Это помогает предотвратить сбои при использовании KVO, поскольку во время компиляции он проверяет, что ваш keyPath действителен, а не сбой во время выполнения, если это не так.

Соответственно, вы не указываете keyPath для конкретного экземпляра, вы указываете его для типа объекта. Вот почему ваша первая строка работает, а вторая - нет.

Вы указываете конкретный экземпляр объекта, на котором вы хотите наблюдать keyPath при вызове addObserver:

demo.addObserver(someObserver, forKeyPath: #keyPath(UIButton.isSelected), options: [], context: nil)

Вы также можете сказать

demo.addObserver(someObserver, forKeyPath: "selected", options: [], context: nil)

с тем же результатом

Но если вы случайно наберете "slected" вместо "selected", вы не узнаете об этом до тех пор, пока ваше приложение не выйдет из строя во время выполнения, тогда как #keyPath(UIButton.isSlected) сразу выдаст вам ошибку компилятора.

...