#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)
сразу выдаст вам ошибку компилятора.