Any
在Swift中Any是什么?在Swift中是这样定义的:public typealias Any = protocol<> 。是一个空协议集合的别名,它表示没有实现任何协议,因此可以是任何类型,包括函数,枚举,结构体,保持类型的原生状态(不会隐式转换),可以存储swift的类型或者Object-C类型。所有类型都隐式遵守了这个协议。官方文档是这样解释的/// The protocol to which all types implicitly conform.
看看具体内容
1 | class MediaItem { |
看看显示结果
1 | [9, 9.0, "hello", (Function), (Function), __lldb_expr_30.Movie, Optional(3), <__NSArrayI 0x600003275b40>( |
类型保持了原生状态,包括OC中的数据类型,注意@convertion(block)类型,待会对比。
AnyObject
苹果官方文档是这样定义的:@objc public protocol AnyObject { } ,可以表示任何class类型的实例,来替代OC中的id类型,也就是swift转OC的桥梁。所有的类都隐式遵循了这个协议,官方文档the protocol to which all classes implicitly conform.
我们来看看使用AnyObject会发生什么情况
1 | class MediaItem { |
输出结果显示
1 | _SwiftValue |
可以看出AnyObject隐式转换了类型,对于Tuple、struct类型,OC并不存在或者定义不一样,所以保持swift的值类型,对于使用了@conversion(block)修饰一个闭包,被转换成了__NSMallocBlock__,真正转换成OC中的block块,如果把@conversion(block)去掉,会转换成一个(Function),仅仅被当成普通函数。可以看使用Any的时候对比下。
AnyClass
AnyClass 表示任意类的元类型,苹果官方文档:public typealias AnyClass = AnyObject.Type , 解释道:/// The protocol to which all class types implicitly conform.任意类的类型都隐式遵守这个协议.其中 .Type就是获得元类型的。注意如果某个变量或者常量的类型是AnyClass,你需要显示的转换成具体类型,然后再调用init()方法实例对象。参考:swift根据类型(AnyClass)创建对象