为什么 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 对应物,例如 NSString
、NSNumber
、NSArray
、NSDictionary
等。所有其他 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
,因为它们基本上是相同的
我对 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 对应物,例如 NSString
、NSNumber
、NSArray
、NSDictionary
等。所有其他 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 toNSString
using the type-cast operator (as
), and anyString
instance that originates in Objective-C may use anNSString
这基本上告诉我们,你可以毫无问题地将 String class
扔给 String struct
,因为它们基本上是相同的