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)创建对象