Swift 为什么SomeStruct()是AnyObject返回true?

Swift 为什么SomeStruct()是AnyObject返回true?,swift,anyobject,Swift,Anyobject,我对任何对象的用法都有点困惑。让我举几个例子 AnyObject NSObject() is AnyObject ^正确(如预期) ^正确(如预期) ^正确(如预期) ^正确(如预期的那样) ^true(与预期的不同;字符串似乎是结构) ^假(如预期) 苹果公司关于AnyObject的文档中的一个片段: AnyObject可以用作任何类、类类型或仅类协议实例的具体类型 为什么struct的实例被视为AnyObject?呃,这是我对Swift的抱怨之一。这是一个Objective C互操作特性,

我对任何对象的用法都有点困惑。让我举几个例子

AnyObject

NSObject() is AnyObject
^正确(如预期)

^正确(如预期)

^正确(如预期)

^正确(如预期的那样)

^true(与预期的不同;字符串似乎是结构)

^假(如预期)

苹果公司关于AnyObject的文档中的一个片段:

AnyObject可以用作任何类、类类型或仅类协议实例的具体类型


为什么struct的实例被视为AnyObject?

呃,这是我对Swift的抱怨之一。这是一个Objective C互操作特性,虽然有用,但太含蓄/神秘了。这种隐式拳击行为只发生在基金会被导入时,只有在Objc支持系统(苹果平台)上。 一些Swift类型连接到特定的ObjC对应项,如
NSString
NSNumber
NSArray
NSDictionary
,等等。所有其他Swift值类型(如结构和元组)都可以封装在名为
\NSSwiftValue
的私有ObjC类中,这使得将它们交给objcapis成为可能


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

啊,这是我对Swift的抱怨之一。这是一个Objective C互操作特性,虽然有用,但太含蓄/神秘了。这种隐式拳击行为只发生在基金会被导入时,只有在Objc支持系统(苹果平台)上。 一些Swift类型连接到特定的ObjC对应项,如
NSString
NSNumber
NSArray
NSDictionary
,等等。所有其他Swift值类型(如结构和元组)都可以封装在名为
\NSSwiftValue
的私有ObjC类中,这使得将它们交给objcapis成为可能


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

因此基本上
String
NSString
有一个桥接连接,后者是一个
NSObject
。如果我们将apple文档带到,我们可以看到它是一个
typedef结构
typealias
,如果您愿意的话。如果我们继续查看并向下滚动列表,我们将看到在上一个链接中,
CFStringRef
作为
struct
桥接到
NSString
作为

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

任何
String
实例都可以使用类型转换桥接到
NSString
运算符(
as
),以及源自Objective-C的任何
String
实例 可以使用
NSString


这基本上告诉我们,您可以毫无问题地将
字符串类
抛出到
字符串结构
,因为它们基本上是相同的

,所以基本上
字符串
NSString
有一个桥接连接,这是一个
NSObject
。如果我们将apple文档带到,我们可以看到它是一个
typedef结构
typealias
,如果您愿意的话。如果我们继续查看并向下滚动列表,我们将看到在上一个链接中,
CFStringRef
作为
struct
桥接到
NSString
作为

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

任何
String
实例都可以使用类型转换桥接到
NSString
运算符(
as
),以及源自Objective-C的任何
String
实例 可以使用
NSString


这基本上告诉我们,您可以毫无问题地将
字符串类
抛出到
字符串结构
,因为它们基本相同

谢谢您的回答!我可以理解这是如何应用于String/Int/etc的,因为Objective-C中有等价的类型。但是-为什么它会发生在任何任意结构(比如MyStruct)上呢。它是将我的结构桥接到NSDictionary中吗?@AlexLarson不是,它将它包装在一个名为
\NSSwiftValue
的框中,这是一个
NSObject
子类,其唯一的实例变量是正在装箱的swift值。Ohhhh!我看错了。谢谢你的澄清!谢谢你的回答!我可以理解这是如何应用于String/Int/etc的,因为Objective-C中有等价的类型。但是-为什么它会发生在任何任意结构(比如MyStruct)上呢。它是将我的结构桥接到NSDictionary中吗?@AlexLarson不是,它将它包装在一个名为
\NSSwiftValue
的框中,这是一个
NSObject
子类,其唯一的实例变量是正在装箱的swift值。Ohhhh!我看错了。谢谢你的澄清!
class MyClass {}
MyClass() is AnyObject
class MyClass {}
MyClass.self is AnyObject
String() is AnyObject
struct MyStruct {}
MyStruct() is AnyObject
String.self is AnyObject