“AnyObject”在语言中是否特殊?

时间:2014-06-11 03:45:14

标签: swift

跳转到Xcode中AnyObject的定义,似乎AnyObject声明如下:

@class_protocol protocol AnyObject {
}

但是,如果我尝试像这样声明我自己的协议,它仍然不能像AnyObject那样工作:

@class_protocol protocol Foo {
}
@objc class Bar {
}
var x : Foo = Bar() // compile error: Type 'Bar' does not conform to protocol 'Foo'
var y : AnyObject = Bar() // works

我也尝试了@objc @class_protocol protocol Foo,但它也无效。


此外,AnyObject具有可以调用任何方法的属性,该方法在@objc方法的任何地方声明。而对于任何其他协议,您只能调用编译器知道协议支持的方法:

@objc protocol Blah {
    func bogus()
}
@class_protocol protocol Foo {
}
class FooImpl : Foo {
}
var x : Foo = FooImpl()
var y : AnyObject = FooImpl()
x.bogus() // compile error
y.bogus() // works

AnyObject在某种程度上是特殊的语言或其他东西?

2 个答案:

答案 0 :(得分:1)

是的,确实如此。根据官方手册:

“AnyObject可以表示任何类类型的实例。”

答案 1 :(得分:1)

它的声明并不特别,它在每个类隐式符合AnyObject的意义上都是特殊的。

这里唯一特别的是隐式部分,所以如果你输入

class Foo {}

编译器实际上会生成

class Foo: AnyObject {}

同样,对于类型系统或@class_protocol定义,还有 nothing 特别之处,因为您可以通过使每个类明确地实现相同的结果符合AnyObject协议。

然而,使用编译器自动执行此操作是支持传统Objective-C代码的唯一理智解决方案。

为了使您的示例有效,因为您没有编译器的帮助,您必须键入

@class_protocol protocol Foo {}
@objc class Bar: Foo {}
var x : Foo = Bar()

更新

那不完全正确。在引用Objective-C兼容性时,AnyObject确实很特殊,因为您可以在其上调用任何Objective-c方法,编译器不会抱怨。

但这仅适用于Objective-C方法。

在上一个示例中,如果您取消@objc关键字,则会在两次调用时产生编译时错误。

protocol Blah {
    func bogus()
}
@class_protocol protocol Foo {
}
class FooImpl : Foo {
}
var x : Foo = FooImpl()
var y : AnyObject = FooImpl()
x.bogus() // compile error
y.bogus() // compile error