Swift:AnyObject,Any和AnyClass

作者: Monkey_ALin | 来源:发表于2016-03-23 13:42 被阅读4831次

    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], 在其下面插入一个断点, 如下图所示
    截图.png
     没错, 它将基本数据类型`int`转换成了Objective-C中的`NSNumber`对象, 
    

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

    Any

    • Any是什么? 同上, 我们进入Any所在的头文件: public typealias Any = protocol<>, 关于type alias, 大家可以进入喵神的<a href="http://swifter.tips/typealias/">TYPEALIAS 和泛型接口</a>这篇文章进行详细了解. 我们直接看Any的注释:/// The protocol to which all types implicitly conform., (小tip:///在Swift中就是文档注释), 意思是所有的类型, 都隐式的遵守这个协议.
    • 说得更直白一点, 就是所有的类型都可以用Any表示, 包括基本数据类型, enum, struct, func(方法)等等.
    • 此时, 我们和AnyObject, 我们也定义一个数组, 用Any类型保存: let array: [Any] = ["123", 123], 同样插入一个断点, 如图:
    截图.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可以参考我的另一篇文章<a href="http://www.jianshu.com/p/f2503afff164">Swift:获取命名空间(namespace),动态加载类</a>

    联系我

    <a href="https://github.com/SunLiner">github</a>

    <a href="http://www.weibo.com/5589163526/profile?rightmod=1&wvr=6&mod=personinfo&is_all=1">微博</a>

    <a href="http://www.jianshu.com/users/9723687edfb5/latest_articles">简书</a>

    相关文章

      网友评论

      • 阿呆少爷:发现一处笔误,AnyObject和Any两个array都写成 let array: [Any] = ["123", 123]了,望改正O(∩_∩)O~
        Alan龙马:确实

      本文标题:Swift:AnyObject,Any和AnyClass

      本文链接:https://www.haomeiwen.com/subject/iubllttx.html