为什么 SomeStruct() is AnyObject return 为真?

Why does SomeStruct() is AnyObject return true?

我对 AnyObject 的用法有点困惑。让我举几个例子。

AnyObject

NSObject() is AnyObject

^ 正确(符合预期)

class MyClass {}
MyClass() is AnyObject

^ 正确(符合预期)

class MyClass {}
MyClass.self is AnyObject

^ 正确(符合预期)

String() is AnyObject

^ 正确(与预期不同)

struct MyStruct {}
MyStruct() is AnyObject

^ true(与预期不同;String 似乎是一个结构)

String.self is AnyObject

^ 错误(如预期)

Apple 文档中有关 AnyObject 的片段:

AnyObject can be used as the concrete type for an instance of any class, class type, or class-only protocol.

为什么struct的实例被认为是AnyObject?

呃,这是我对 Swift 的抱怨之一。这是一项 Objective C 互操作功能,虽然很有用,但也 implicit/mysterious。这种隐式装箱行为仅在导入 Foundation 时发生,并且仅在支持 ObjC 的系统(Apple 平台)上发生。

一些 Swift 类型桥接到特定的 ObjC 对应物,例如 NSStringNSNumberNSArrayNSDictionary 等。所有其他 swift 值类型(如结构和元组)能够包装在称为 _NSSwiftValue 的私有 ObjC class 中,这使得将它们交给 ObjC API 成为可能。

最令人困惑的是,就Objective C而言,该对象的标识(对象地址)定义不明确,如果您的类型不符合Hashable,则对象的 Hash 值也是定义错误的,这会导致各种难以确定的错误。

所以基本上 String 有一个到 NSString 的桥接连接,这是一个 NSObject。如果我们在 This place We can see that it's a typedef struct or typealias if you so will. And if we move on to look over here 处获取苹果文档并在列表中向下滚动,我们将看到在之前的 link 中 CFStringRef 作为 struct 被桥接到 NSString 作为 class

在 Xcode 的下方,我们可以看到 String

的文档

Any String instance can be bridged to NSString using the type-cast operator (as), and any String instance that originates in Objective-C may use an NSString

这基本上告诉我们,你可以毫无问题地将 String class 扔给 String struct,因为它们基本上是相同的