Переопределение метода привязки (Swift) - Err: значение типа 'Any' не имеет члена 'addObserver' - PullRequest
0 голосов
/ 28 мая 2019

Я довольно новичок в программировании на Swift и "Apple", поэтому извините, если мой вопрос глупый.

Я пытаюсь создать подкласс NSPopupButton, чтобы добавить опцию для привязки свойства изображения пунктов меню.

Я хочу переопределить функцию «bind»:

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 для наблюдаемого параметра?

Как видите, я пытался привести наблюдаемое к типу AnyObject, но затем получил другую ошибку, для которой не смог найти решение.

Я изменил строку addObserver на:

observableObject.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)

и получил:

Type of expression is ambiguous without more context

Если приведение наблюдаемого к AnyObject является решением, то что означает эта ошибка и что я делаю неправильно?

Спасибо

1 Ответ

0 голосов
/ 28 мая 2019

Компилятор сообщает вам, что 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)

...