В контроллере представления в моем приложении я реагирую на изменения позиционирования представления, определяя ключ-значение, наблюдая за его свойством center
, например:
class CoordinatingViewController: UIViewController {
@IBOutlet weak var cardContainerView: CardView!
override func viewDidLoad() {
super.viewDidLoad()
addObserver(self, forKeyPath: "cardContainerView.center", options: [.new], context: nil)
}
}
Пока это прекрасно работает, но так как этот путь ключа является строкой, он не может быть проверен компилятором.Чтобы смягчить это, я хотел бы использовать синтаксис #keyPath()
в Swift 3, который принимает проверенный компилятором путь к ключу и возвращает соответствующую соответствующую строку.Однако, когда я изменяю эту строку, чтобы использовать ее следующим образом:
addObserver(self, forKeyPath: #keyPath(cardContainerView.center), options: [.new], context: nil)
Компилятор выдает мне 2 ошибки:
- Тип 'CardView!'нет члена 'center'
- Невозможно сослаться на член типа type 'center' в экземпляре типа 'CardView!'
Я не понимаю, почему я получаюэти ошибки, так как center
является документированным свойством UIView
, от которого наследуется CardView
напрямую, который я могу читать и записывать вне оператора #keyPath()
.Кроме того, все выглядит нормально, когда я передаю путь ключа непосредственно в виде строки, как в моем первом примере, что делает это еще более запутанным.Как я могу заставить компилятор проверить этот ключевой путь для меня?