通过跳转到Xcode中AnyObject
的定义,似乎AnyObject
是这样声明的:
@class_protocol protocol AnyObject {
}
但是,如果我尝试像这样声明自己的协议(protocol),它仍然无法像 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
方法的任何方法。而对于任何其他协议(protocol),您只能调用编译器知道该协议(protocol)支持的方法:
@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
是否在某种语言中有某种特殊情况?
最佳答案
它的声明并不特殊,它的特殊之处在于每个类都隐式符合 AnyObject
。
这里唯一特别的是隐式部分,所以如果你输入
class Foo {}
编译器会实际产生
class Foo: AnyObject {}
同样,类型系统或 @class_protocol
定义没有什么特别之处,因为您可以通过每个类都明确符合 AnyObject
协议(protocol)。
然而,使用编译器自动执行此操作是支持遗留 Objective-C 代码的唯一明智的解决方案。
为了让你的例子工作,因为你没有编译器的帮助,你必须输入
@class_protocol protocol Foo {}
@objc class Bar: Foo {}
var x : Foo = Bar()
更新
嗯,这并不完全正确。 AnyObject
在提到 Objective-C 兼容性时确实很特别,因为您可以在其上调用任何 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
关于swift - `AnyObject` 在语言中有特殊意义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24154310/