为什么Swift让我在AnyObject上调用setTitle?

Ian*_*ton 7 cocoa swift

@IBAction func helloClick(sender: AnyObject) {

    sender.setTitle("Click", forState: UIControlState.Normal)

}
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常.但是setTitle不是一种方法AnyObject吗?这不应该是编译时错误吗?

Col*_*inE 4

这是语言规范的一部分(请参阅有关id 兼容性的部分)

您还可以调用任何 Objective-C 方法并访问任何属性(在 AnyObject 上),而无需转换为更具体的类类型。

这是为了更轻松地实现 Objective-C 互操作。

该指南还规定了以下内容:

但是,由于 AnyObject 类型的对象的具体类型直到运行时才知道,因此可能会无意中编写不安全的代码。

显然,由于代码的有效性仅在运行时确定,因此这可能是不安全的。

  • @IanWarburton:您可以调用任何有“@objc”方法声明的方法名称,并且该名称对编译器可见。您导入了方法名称为“setTitle:”的 API,但从未见过任何方法名称为“setTitle2:”的类。如果您使用名为“setTitle2:”的“@objc”方法声明了一个类,那么是的,它会编译它。 (3认同)