Я новичок в программировании Swift и «Apple», так что извините, если мой вопрос глупый.
Я пытаюсь создать подкласс NSPopupButton, чтобы добавить параметр для привязки свойства изображения элементов меню.
Я хочу переопределить функцию «привязки»:
override func bind(_ binding: NSBindingName, to observable: Any, withKeyPath keyPath: String, options: [NSBindingOption : Any]? = nil)
И наблюдать за «наблюдаемым» параметром, так что это код, который я написал до сих пор:
class WDPopupButton: NSPopUpButton
{
static let ImageBindingContext: UnsafeMutableRawPointer? = UnsafeMutableRawPointer(mutating: "imageContext")
override func bind(_ binding: NSBindingName, to observable: Any, withKeyPath keyPath: String, options: [NSBindingOption : Any]? = nil)
{
if (binding == NSBindingName.image)
{
guard let observableObject = observable as AnyObject? else
{
return
}
observable.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)
...
}
}
}
Но я получаю следующую ошибку:
Value of type 'Any' has no member 'addObserver'
Мой вопрос: что мне нужно сделать, чтобы вызвать addObserver для наблюдаемого параметра?
Как видите, я пытался привести observable к типу AnyObject, но затем получил другую ошибку, для которой не смог найти решения.
Я изменил строку addObserver на:
observableObject.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)
И получил:
Type of expression is ambiguous without more context
Если приведение наблюдаемого к AnyObject является решением, что означает эта ошибка и что я делаю неправильно?
Спасибо





Компилятор сообщает вам, что экземпляры Any не имеют метода с именем addObserver, поэтому observable.addObserver не работает. (Значение типа Any не имеет члена addObserver)
Для observableObject.addObserver это также похоже на то, что указано выше, у AnyObject нет метода addObserver.
РЕШЕНИЕ:
Не приводить к AnyObject, приводить к NSObject. addObserver доступен через NSObject экземпляров. Затем получите доступ к addObserver через переданный экземпляр NSObject.
guard let observableObject = observable as? NSObject else {return}
observableObject.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)
Обновленный ответ. ваша проблема в том, что ? должен быть после as, а не NSObject
Спасибо за ответ. Может быть, я должен был сказать это раньше. Первое, что я попытался сделать, это преобразовать observable в NSObject, но затем я получил другую ошибку: Не удается преобразовать значение типа Any в тип NSObject? по принуждению