为什么像NotificationCenter.addObserver或UIButton.addTarget这样的Objective-C API会被导入到Swift中,并带有一个Any类型的观察者,而不是AnyObject?有什么原因吗?除了类的@objc方法之外,是否可以正确地指定选择器?
NotificationCenter.addObserver
UIButton.addTarget
Any
AnyObject
@objc
mwecs4sa1#
一个原因是,您可以为对象使用协议类型,并且引用和值类型都可能符合该协议。举个例子
protocol Observer { func observe() } class LookOut: Observer { @objc func observe() {} }
这将起作用,因为参数的类型为Any
let observer: Observer = LookOut() NotificationCenter.default.addObserver(observer, selector: #selector(LookOut.observe), name: .NSCalendarDayChanged, object: nil)
但是使用这种方法会失败,因为协议不符合AnyObject
func fakeObserver(_ object: AnyObject, selector: Selector) {}
所以呢
fakeObserver(observer, selector: #selector(LookOut.observe))
生成错误参数类型“any Observer”应是类或类约束类型的示例当然,下面这样的值类型在这两种情况下都不起作用,因为函数不能用@objc注解
struct LookIn: Observer { func observe() {} }
gojuced72#
正如你所说,选择器只对Objective-C对象起作用,这些对象必须是引用类型。观察者的类型可能应该是AnyObject而不是Any。
2条答案
按热度按时间mwecs4sa1#
一个原因是,您可以为对象使用协议类型,并且引用和值类型都可能符合该协议。
举个例子
这将起作用,因为参数的类型为
Any
但是使用这种方法会失败,因为协议不符合
AnyObject
所以呢
生成错误
参数类型“any Observer”应是类或类约束类型的示例
当然,下面这样的值类型在这两种情况下都不起作用,因为函数不能用
@objc
注解gojuced72#
正如你所说,选择器只对Objective-C对象起作用,这些对象必须是引用类型。观察者的类型可能应该是
AnyObject
而不是Any
。