覆盖绑定方法(Swift)-错误:类型“ Any”的值没有成员“ addObserver”

时间:2019-05-28 07:47:49

标签: swift cocoa binding kvc

我对Swift和“ Apple”编程非常陌生,如果我的问题很愚蠢,请原谅。

我正在尝试对NSPopupButton进行子类化,以便添加用于绑定菜单项的image属性的选项。

我要覆盖“绑定”功能:

override func bind(_ binding: NSBindingName, to observable: Any, withKeyPath keyPath: String, options: [NSBindingOption : Any]? = nil) 

要观察“ observable”参数,所以这是我到目前为止编写的代码:

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' 

我的问题是,要在observable参数上调用addObserver,我需要做什么?

如您所见,我确实尝试将observable转换为AnyObject类型,但是随后又收到另一个错误,找不到解决方案。

我将addObserver行更改为:

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

得到了:

Type of expression is ambiguous without more context

如果将可观察到的AnyObject强制转换是解决方案,那么此错误意味着什么,我在做什么错了?

谢谢

1 个答案:

答案 0 :(得分:0)

编译器告诉您Any实例没有名为addObserver的方法,这就是observable.addObserver不起作用的原因。 (“ Any”类型的值没有成员“ addObserver”)

对于observableObject.addObserver,它也与上面类似,AnyObject没有addObserver方法。

解决方案:

请勿强制转换为AnyObject,请勿强制转换为NSObjectaddObserver可通过NSObject实例访问。然后通过强制转换的addObserver实例访问NSObject

guard let observableObject = observable as? NSObject else {return}

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