swift 为什么导入的API使用Any而不是AnyObject?

tvz2xvvm  于 2023-06-21  发布在  Swift
关注(0)|答案(2)|浏览(127)

为什么像NotificationCenter.addObserverUIButton.addTarget这样的Objective-C API会被导入到Swift中,并带有一个Any类型的观察者,而不是AnyObject
有什么原因吗?除了类的@objc方法之外,是否可以正确地指定选择器?

mwecs4sa

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() {}
}
gojuced7

gojuced72#

正如你所说,选择器只对Objective-C对象起作用,这些对象必须是引用类型。观察者的类型可能应该是AnyObject而不是Any

相关问题