Я новичок в программировании 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? по принуждению