Ссылка на подкласс UIView .center с помощью Swift 3 #keyPath - PullRequest
0 голосов
/ 31 мая 2018

В контроллере представления в моем приложении я реагирую на изменения позиционирования представления, определяя ключ-значение, наблюдая за его свойством 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 ошибки:

  1. Тип 'CardView!'нет члена 'center'
  2. Невозможно сослаться на член типа type 'center' в экземпляре типа 'CardView!'

Я не понимаю, почему я получаюэти ошибки, так как center является документированным свойством UIView, от которого наследуется CardView напрямую, который я могу читать и записывать вне оператора #keyPath().Кроме того, все выглядит нормально, когда я передаю путь ключа непосредственно в виде строки, как в моем первом примере, что делает это еще более запутанным.Как я могу заставить компилятор проверить этот ключевой путь для меня?

1 Ответ

0 голосов
/ 31 мая 2018

Похоже, Свифт недоволен модификатором weak.Удалите его, и код скомпилируется.Начиная с этого , мы видим, что торговые точки рекомендуется быть сильными, если у вас фактически нет цикла сохранения.См. Мой ответ здесь , чтобы узнать, как найти циклы хранения.

В Swift 4 вы сможете сделать это, используя новый синтаксис \ key path:

// no problems with "weak"!
let observation = observe(\.cardContainerView.center) { (object, change) in
    ...
}
...