Swift:AnyObject,Any和AnyClass

AnyObject

  • AnyObject是个什么玩意呢? 有什么用呢?

    • 我们点进其头文件看一下, 发现@objc public protocol AnyObject { }, 这个单词protocol大家都认识吧, 对AnyObject是一个协议, 它的注释第一行有这么一句话:The protocol to which all classes implicitly conform.意思是所有的类都隐式遵守了这个协议.

    • AnyObject有什么用呢?有过Objective-C开发经验的人肯定知道id, 它可以表示任意类的实例, 编译器不会对向声明为 id 的变量进行类型检查.而 Swift为了与 Cocoa 架构进行协作开发,就将原来的id用 AnyObject 来进行替代。

  • AnyObject的自动类型转换

    • Objective-C的NSArray里面只能保存对象类型, 不能添加基本数据类型, 枚举,结构体等.但是如果我们在Swfit里面将Array的元素类型声明成AnyObject会发生什么呢? 我们定义一个数组: let array:[Any] = ["123", 123], 在其下面插入一个断点, 如下图所示
Swift:AnyObject,Any和AnyClass_第1张图片
截图.png
 没错, 它将基本数据类型`int`转换成了Objective-C中的`NSNumber`对象, 

所以在Swift中, 我们将基本数据类型或者enum和struct通过AnyObject来保存也不会像Objective-C那样报错, 因为Swift中很多数据类型可以和Objective-C中的数据类型进行自动转换

Any

  • Any是什么? 同上, 我们进入Any所在的头文件: public typealias Any = protocol<>, 关于type alias, 大家可以进入喵神的TYPEALIAS 和泛型接口这篇文章进行详细了解. 我们直接看Any的注释:/// The protocol to which all types implicitly conform., (小tip:///在Swift中就是文档注释), 意思是所有的类型, 都隐式的遵守这个协议.
  • 说得更直白一点, 就是所有的类型都可以用Any表示, 包括基本数据类型, enum, struct, func(方法)等等.
  • 此时, 我们和AnyObject, 我们也定义一个数组, 用Any类型保存: let array: [Any] = ["123", 123], 同样插入一个断点, 如图:
Swift:AnyObject,Any和AnyClass_第2张图片
截图.png
 显而易见, `Any `并不会如同`AnyObject `一样进行数据类型的转换

AnyClass

  • AnyClass: 表示任意类的元类型.它所在的头文件这样写道:public typealias AnyClass = AnyObject.Type, 它的注释第一句就指明了:/// The protocol to which all class types implicitly conform., 任意类的类型都隐式遵守这个协议. AnyObject.Type中的.Type就是获取元类型, 辟如你有一个Student类, Student.Type就是获取Student的元类型.

  • 如果一个变量/常量的类型是AnyClass, AnyClass并不知道其具体的类型, 所以需要将他转换为已知的类型, 然后再调用init()方法创建对象

  • 关于AnyClass可以参考我的另一篇文章Swift:获取命名空间(namespace),动态加载类

联系我

github

微博

你可能感兴趣的:(Swift:AnyObject,Any和AnyClass)