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