gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:35:02 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com