swift - `AnyObject` 在语言中有特殊意义吗?

标签 swift

通过跳转到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/

相关文章:

ios - 动画约束快速适合所有屏幕

swift - 日期/时间的重复函数

ios - facebook swift sdk 0.2.0 swift 3.1 登录页面保持打开状态

ios - 具有自动布局的 IBCollectionOutlet 按钮数组

swift - 如何实现返回协变 Selfs 的协议(protocol)方法?

ios - 非常意外的未包装零值

swift - 在另一个线程上保存 NSManagedContext

ios - Swift UITableView 删除行项目 - tableview 数据源是 Core Data

Swift:条形图内容未水平居中

ios - Firebase 电子邮件已在使用错误