为什么 SomeStruct() is AnyObject 返回 true? [复制]

2023-11-30

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

任意对象

NSObject() is AnyObject

^ true(如预期)

class MyClass {}
MyClass() is AnyObject

^ true(如预期)

class MyClass {}
MyClass.self is AnyObject

^ true(如预期)

String() is AnyObject

^ true(与预期不同)

struct MyStruct {}
MyStruct() is AnyObject

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

String.self is AnyObject

^ false(如预期)

Apple 文档中有关 AnyObject 的片段:

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

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


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

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

最令人困惑的是,就 Objective C 而言,对象有一个不明确的标识(对象地址),并且如果您的类型不符合Hashable,那么该对象的哈希值也是不明确的,这可能会导致各种难以确定的错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 SomeStruct() is AnyObject 返回 true? [复制] 的相关文章

随机推荐