跳转到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
在某种程度上是特殊的语言或其他东西?
答案 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