【问题标题】:Why does SomeStruct() is AnyObject return true? [duplicate]为什么 SomeStruct() is AnyObject 返回 true? [复制]
【发布时间】:2020-05-19 13:37:03
【问题描述】:

我对 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.self is AnyObject

^ 假(如预期)

Apple 文档中关于 AnyObject 的 sn-p:

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

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

【问题讨论】:

    标签: swift anyobject


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答!我可以理解这可能如何适用于 String/Int/etc,因为在 Objective-C 中有等效的类型。但是 - 为什么会发生任何任意结构(如 MyStruct)。是否将我的结构桥接到 NSDictionary 中?
    • @AlexLarson 不,它将它包装在一个名为 _NSSwiftValue 的盒子中,这是一个 NSObject 子类,其唯一的实例变量是被装箱的 swift 值。
    • 噢噢噢!我看错了。感谢您的澄清!
    【解决方案2】:

    所以基本上StringNSString 有一个桥接连接,即NSObject。如果我们在This place 获取苹果文档,我们可以看到它是typedef structtypealias,如果你愿意的话。如果我们继续查看over here 并在列表中向下滚动,我们将看到在上一个链接中,CFStringRef 作为struct 被桥接到NSString 作为class

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

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

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

    【讨论】:

      猜你喜欢
      • 2018-11-29
      • 2021-11-10
      • 2016-11-14
      • 2014-12-20
      • 2015-06-22
      • 2015-10-07
      • 2019-02-08
      • 2015-05-06
      • 1970-01-01
      相关资源
      最近更新 更多