在Swift中能够表示 “任意” 这个概念的除了 Any 和 AnyObject 以外,还有一个AnyClass。我们能够使用AnyClass协议作为任意类型实例的具体类型。AnyClass在Swift中被所定义:
 
  1. typealias AnyClass = AnyObject.Type
通过AnyObject.Type这种方式所得到是一个元类型 (Meta)。在声明时我们总是在类型的名称后面加上.type,比如:Person.type代表的是A这个类型的类型。也就是说,我们可以声明一个元类型来存储Person这个类型本身,而在从Person中取出其类型时,我们需要使用到.self:
  1. class Person {
  2. }
  3. let type: AnyClass = Person.self //Person.Type
注意:其实在 Swift中,.self可以用在类型后面取得类型本身,也可以用在某个实例后面取得这个实例本身。前一种方法可以用来获得一个表示该类型的值,这在某些时候会很有用; 而后者因为拿到的实例本身,所以暂时似乎没有太多需要这么使用的案例。
 
如果Person中有一个类方法时,我们就可以通过type来对其进行调用了:
  1. class Person {
  2. class func age() -> Int {
  3. return 24
  4. }
  5. }
  6. let type: AnyClass = Person.self
  7. //1:
  8. (type as! Person.Type).age()
  9. //2:
  10. let type2: Person.Type = Person.self
  11. type2.age()

AnyClass的使用场景

元类型可以变得非常灵活和强大,而且在我们编写某些框架性的代码时会非常方便。比如我们想要传递一些类型的时候,我们可以使用AnyClass进行处理,那么就不需要不断地去改动代码了。下面的这个例子中虽然我们是用代码声明的方式获取了SearchViewController和MessageViewController的元类型,但是其实这一步骤完全可以通过读入配 置文件之类的方式来完成的。而在将这些元类型存入数组并且传递给别的方法来进行配置这一点上,元类型编程就非常棒而且很难被替代:
  1. class SearchViewController: UIViewController {
  2. }
  3. class MessageViewController: UIViewController {
  4. }
  5. let vcTypes: [AnyClass] = [SearchViewController.self,
  6. MessageViewController.self]
  7. func setupViewControllers(_ vcTypes: [AnyClass]) {
  8. for vcType in vcTypes {
  9. if vcType is UIViewController.Type {
  10. let vc = (vcType as! UIViewController.Type).init()
  11. print(vc)
  12. }
  13. }
  14. }
  15. setupViewControllers(vcTypes)
  16. /*
  17. <__lldb_expr_160.SearchViewController: 0x7ff265703060>
  18. <__lldb_expr_160.MessageViewController: 0x7ff265602c10>
  19. */

这么一来,我们完全可以搭好框架,可以在不触及Swift编码的情况下,很简单地完成一系列复杂操作了。

另外,在 Cocoa API中我们经常遇到需要输入一个AnyClass,我们应该使用.self的方式来获取对应的类型。如注册tableView的可重用cell时:
  1. tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
注意:.Type 表示的是某个类型的元类型,而在Swift中,除了class,struct和enum这三个类型外,我们还可以定义protocol。对于protocol来说,有时候我们也会想取得协议的元类型。这时我们可以在某个protocol的名字后面使用.Protocol 来获取,使用的方法和 .Type是类似的。
 
https://blog.csdn.net/longshihua/article/details/74353273

Swift - AnyClass,元类型和 .self的更多相关文章

  1. .NET 中,编译器直接支持的数据类型称为基元类型(primitive type).基元类型和.NET框架类型(FCL)中的类型有直接的映射关系.

    .NET 中,编译器直接支持的数据类型称为基元类型(primitive type).基元类型和.NET框架类型(FCL)中的类型有直接的映射关系. The primitive types are Bo ...

  2. Swift数据类型_整型和浮点型

    //swift中的整型和浮点型 /** * //类型推断整数是Int 浮点数是Double ,日常使用需要注意不能越界,存储时间毫秒数 英雄经验数等等之类内容容易越界 整型 大多数情况下,你不需要在代 ...

  3. 面向对象:元类、异常处理(try...except...)

    元类: python中一切皆对象,意味着: 1. 都可以被引用,如 x = obj 2. 都可以被当做函数的参数传入 3. 都可以被当做函数的返回值 4. 都可以当做容器类的元素(列表.字典.元祖.集 ...

  4. python之元编程(元类实例)

    本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保 ...

  5. python 元类

    转载自  http://blog.jobbole.com/21351/ 类也是对象 在理解元类之前,你需要先掌握Python中的类.Python中类的概念借鉴于Smalltalk,这显得有些奇特.在大 ...

  6. Python语言特性之2:元类

    问题:Python中的元类(metaclasses)是什么?一般使用它干什么? 原地址:http://stackoverflow.com/questions/100003/what-is-a-meta ...

  7. DATETIME类型和BIGINT 类型互相转换

    项目中使用BIGINT来存放时间,以下代码用来转换时间类型和BIGINT类型 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ========= ...

  8. AngularJs:String类型和JSON相互转换

    最近一周做了一个页面,制作的过程中遇到各种问题,从中可以看出本人的js基础还不够扎实,angularjs也只是刚入门的水平,现在将制作过程中遇到的问题一一汇总,方便以后查阅. 一.String类型和J ...

  9. python基础——使用元类

    python基础——使用元类 type() 动态语言和静态语言最大的不同,就是函数和类的定义,不是编译时定义的,而是运行时动态创建的. 比方说我们要定义一个Hello的class,就写一个hello. ...

随机推荐

  1. BUPT2017 springtraining(16) #2 ——基础数据结构

    题目在这里 A.似乎是个并查集+??? B.10W的范围,似乎可以暴力来一发二分+sort? 但我猜正解可以O(nlogn)? C.单调队列入门题目 #include <cstdio> ] ...

  2. ubuntu 14.04 gcc/g++版本降低

    Matlab 2014a支持的gcc/g++版本是4.7x,而ubuntu 14.04以及更高版本默认安装的版本都是4.8及以上,因此需要降低gcc/g++版本,方法如下: 1 安装 $ sudo a ...

  3. [Codeforces 872]比赛记录

    强行打了$cf$上的第一场比赛,现在感觉自己的$rating$会炸飞= = A  这是练习输入输出吗QAQ,竟然$WA$了两遍QAQ,我$WA$的一声就哭了出来啊QAQ B  好像很水的乱扫就好了,m ...

  4. 暑假集训D20总结

    刷题 今天是瞎XX切题的一天 我要是不写题解的话,我自己都不知道刷了多少专题 数学什么的= = 生活 也就那样吧,没啥特别的 这两天倒是特别鬼畜 先是我点了一下某喵的$cena$,然后他的$cena$ ...

  5. [poj1062]昂贵的聘礼_最短路_离散化

    昂贵的聘礼 poj-1062 题目大意:原文链接?不是英文题,自己看 注释:$1\le N \le 100$. 想法:开始的想法有些过于简单,因为落下了一个条件:就是等级限制是一条路径上的任意两点而不 ...

  6. Bootstrap:解决Bootstrap下拉框需要双击才能打开的问题

    当使用AngularJS和Bootstrap时,会发生菜单栏navbar控件 需要点击两下才能打开的问题.解决的方法就是在页面加载后,执行如下语句: // 防止下拉菜单需要双击的bug $('.dro ...

  7. Android Notification状态栏通知

    没有添加额外的震动及声音效果,这里直接实现了通知的功能,看效果吧: MainActivity.java package com.example.notification; import android ...

  8. 设计模式学习–Decorator

    What Decorator:动态地给一个对象加入一些额外的职责. 就添加功能来说.Decorator模式相比生成子类更加灵活. Why Decorator模式适用于能够动态的给对象增删职责.比方qq ...

  9. 游戏人生(一),我的lua之旅:那些坑爹的CCBReaderLoad

    首先,我们说说这个CCBReaderLoad. 这个脚本是cocos2dx自带的一个lua+cocosbuilder 的工具,详细功能呐,往下看. 先来看下我遇到的一个问题: ----美工给了我一个. ...

  10. EF + WCF学习笔记——EF实体类序列化

    项目中如果 EF + WCF 结合使用,模式应该是EF负责读取数据库,传递数据对象给WCF,WCF再将这些对象传送给客户端.因为WCF传送的对象需要序列化,而EF默认生成的对象并没有序列化,很可能会出 ...