Swift 3.0中的Any vs.AnyObject

当我在第一次解析JSON数据时遇到这两个类型别名时,我不知道如何正确区分或实现它们。 那是什么 AnyAnyObject是Swift中的两个特殊类型,用于处理非特定类型。

根据Apple的Swift文档,

  • Any 可以代表任何类型的实例,包括函数类型和可选类型。
  • AnyObject 可以代表任何类类型的实例。

好的,很简单-所有类型都使用Any ,Class类使用AnyObject ,对吗?

为了了解它们在代码中的实际行为,我决定在Playground中与它们一起玩。

任何人都允许我使用不同类型的混合函数,包括函数和非类类型,例如Int,String和Bool。 根据文档,此数组中的元素是作为值类型的Structs,因此从理论上讲, AnyObjec t在这些情况下不起作用。

为了验证这一点,我尝试使用AnyObject包括String和Ints,这是Swift中的值类型。

不出所料,编译器向我抛出一个错误,指出元素与数组中的AnyObject类型不符 。 知道了!

然后,当我尝试遵循编译器的建议时,发生了一件奇怪的事情:

刚刚发生了什么?! 如何通过将每个元素显式转换为AnyObject来在整数和字符串上使用AnyObject

然后,我将anyObjectArray打印到控制台中。

在我看来, Hi元素显然看起来像是一个字符串,但是在Swift中却没有像普通的String值一样引号!

接下来,我使用for-in循环打印每个元素,以检查其实际类型,而不是AnyObject的强制类型。

首先,我使用了is运算符来查看元素是否为Swift Struct类型。

它是String类型的! 那么如何将其转换为AnyObject呢? 同样,Swift中的字符串是结构,而不是类类型。 因此,从理论上讲,我不应该将它们转换为AnyObject

我完全感到困惑,决定对它做更多的实验。 这次,我使用了Objective-C类型的NSNumber和NSString来检查每个元素的类型。

等等, 也是NSString,数字元素是NSNumber! 而且……它们是Objective-C中的引用类型! 这是为什么Hi在控制台上没有引号的原因吗? 我写了一些下面的代码,看我的假设是否正确。 🔎

已确认! 现在, 转换为数组中AnyObject的元素是Objective-C的类类型:NSString和NSNumber。

那么……幕后到底发生了什么? 我继续深入研究该主题,并从文档“ 将Swift与Cocoa和Objective-C(Swift 3.0.1)”中找到了最合理的答案。

作为与Objective-C互操作性的一部分,Swift提供了使用Cocoa框架的便捷高效的方法。 Swift会自动将某些Objective-C类型转换为Swift类型,并将某些Swift类型转换为Objective-C类型。 可以在Objective-C和Swift之间转换的 类型 称为 桥接类型

Interesting Posts