覆盖绑定方法 (Swift) - 错误:类型 'Any' 的值没有成员 'addObserver'
Overriding bind method (Swift) - Err: Value of type 'Any' has no member 'addObserver'
我对 Swift 和 "Apple" 编程还很陌生,如果我的问题很愚蠢,请原谅。
我正在尝试子class NSPopupButton 以添加用于绑定菜单项图像的选项属性。
我想覆盖 "bind" 函数:
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'
我的问题是,我需要做什么才能在可观察参数上调用 addObserver?
如您所见,我确实尝试将 observable 转换为 AnyObject 类型,但随后我收到另一个错误,我找不到解决方案。
我将 addObserver 行更改为:
observableObject.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)
并得到:
Type of expression is ambiguous without more context
如果将 observable 转换为 AnyObject 是解决方案,那么这个错误是什么意思,我做错了什么?
谢谢
编译器告诉您 Any
个实例没有名为 addObserver
的方法,这就是 observable.addObserver
不起作用的原因。 (类型 'Any' 的值没有成员 'addObserver')
对于observableObject.addObserver
,也和上面类似,AnyObject没有addObserver
方法。
解决方案:
不要转换为 AnyObject
,转换为 NSObject
。 addObserver
可通过 NSObject
个实例访问。然后通过铸造的 NSObject
实例
访问 addObserver
guard let observableObject = observable as? NSObject else {return}
observableObject.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)
我对 Swift 和 "Apple" 编程还很陌生,如果我的问题很愚蠢,请原谅。
我正在尝试子class NSPopupButton 以添加用于绑定菜单项图像的选项属性。
我想覆盖 "bind" 函数:
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'
我的问题是,我需要做什么才能在可观察参数上调用 addObserver?
如您所见,我确实尝试将 observable 转换为 AnyObject 类型,但随后我收到另一个错误,我找不到解决方案。
我将 addObserver 行更改为:
observableObject.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)
并得到:
Type of expression is ambiguous without more context
如果将 observable 转换为 AnyObject 是解决方案,那么这个错误是什么意思,我做错了什么?
谢谢
编译器告诉您 Any
个实例没有名为 addObserver
的方法,这就是 observable.addObserver
不起作用的原因。 (类型 'Any' 的值没有成员 'addObserver')
对于observableObject.addObserver
,也和上面类似,AnyObject没有addObserver
方法。
解决方案:
不要转换为 AnyObject
,转换为 NSObject
。 addObserver
可通过 NSObject
个实例访问。然后通过铸造的 NSObject
实例
addObserver
guard let observableObject = observable as? NSObject else {return}
observableObject.addObserver(self, forKeyPath: keyPath, options: nil, context: WDPopupButton.ImageBindingContext)