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

时间:2014-09-19 13:26:29

标签: cocoa swift

@IBAction func helloClick(sender: AnyObject) {

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

}

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

2 个答案:

答案 0 :(得分:4)

这是语言规范的一部分(请参阅id compatibility

部分
  

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

这是为了更容易实现Objective-C互操作。

指南还说明了以下内容:

  

但是,因为在运行时才知道输入为AnyObject的对象的特定类型,所以可能会无意中编写不安全的代码。

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

答案 1 :(得分:3)

AnyObject与Objective-C id

的行为类似

它允许在其上调用任何方法。 AnyObject 的目的是以绕过编译时错误。你可以调用AnyObject上的任何方法,它将编译正常。您只会在运行时看到错误。

根据文档,

  

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