Swift——Any和 AnyObject区别

AnyObject 可以代表任何class类型的实例
Any 可以表示任意类型,甚至包括方法(func)类型
一、AnyObject 。
写过Objective-C的朋友会知道在Objective-C中有一个叫做id的类型。编译器不会对向声明的为id的变量进行类型检查,它可以表示任意类的实例。在Cocoa框架中不很多地方都使用了id来进行像参数传递和方法返回这样的工作,这是Objective-C动态特性的一种表现。现在的Swift最主要的用途依然是使用Cocoa框架进行app开发,因此为了与Cocoa架构协作,将原来id的概念使用了一个类似的,可以代表任意class 类型的AnyObject来进行替代。
id与AnyObject有本质的区别。在Swift中编译器不仅不会对Anyobject实例的方法调用做出检查,甚至对于AnyObject 的所有方法调用都会返回Optional 的结果。这虽然是符合Anyobject中的理念,但是在Swift环境下使用起来就非常麻烦,也很危险。应该选择的做法是在使用时先确定Anyobject真正的类型并进行转换以后再进行调用。
AnyObject的定义,可以发现它其它就是一个接口: 特别之处在于,所有的class都隐式地实现了这个接口,这也是AnyObject 只适用于class类型 的原因。
二、Any
Swift中所有的基本类型,包括Array 和Dictionary 这些传统意义上会是class的东西,统统都是struct类型,并不能由AnyObject来表示 ,于是Apple提出一个更为特殊的Any。除了class 以外,它还可以包括struct 和enum在内的所有类型。
总结:
AnyObject 可以代表任何class类型的实例
any :表示数据类型

猜你喜欢

转载自blog.csdn.net/u012189584/article/details/78933465
今日推荐