美文网首页
swift元类型

swift元类型

作者: 彭磊PL | 来源:发表于2019-04-27 20:43 被阅读0次

一、元类型(术语表示metaType)

元类型是指所有类型的类型,包括类、结构体、枚举和协议。

  • 类、结构体或枚举类型的元类型是相应的类型名紧跟.Type。
  • 协议类型的元类型,并不是运行时适配该协议的具体类型,是该协议名字紧跟.Protocol。例如,类SomeClass的元类型就是SomeClass.Type,协议SomeProtocol的元类型就是SomeProtocal.Protocol。

比如我们说10是Int类型,此时10是Int类型的一个值。但是如果我问Int类型占用多少内存空间的话,这个时候与具体某个值无关,而和类型的信息相关。如果要写一个函数,返回一个类型的实例内存空间大小,那么这个时候的参数是一个类型数据,这个类型数据可以是直接说明的比如是Int类型,也可以从一个值身上取,比如10这个值的类型。这里的类型数据,就是一个类型的类型。


.Type与.self

swift中的元类型用.Type表示。比如Int.Type就是Int的元类型。
类型与值有着不同的形式,就像Int与10的关系。元类型也是类似,.Type是类型,类型的.self是元类型的值。
因为这两个形式有一些接近,一个元类型只有一个对应的值,所以使用的时候常常写错,如果分清了Int.Type是类型的名称,不是值就不会再弄错了。

AnyClass

获得元类型后可以访问静态变量和静态方法。其实我们经常使用元类型,只是有时Xcode帮我们隐藏了这些细节,比如我们经常使用的tableview的注册方法。

func register(AnyClass?, forCellReuseIdentifier: String)

这里的AnyClass就是一个元类型

typealias AnyClass = AnyObject.Type

通过上面的定义我们可以知道,AnyClass就是一个任意类型元类型的别名。
当我们访问静态变量的时候其实也是通过元类型访问的,只是Xcode帮我们省略了.self。

.type(of:) vs .self

前面提到通过type(of:).self都可以获得元类型的值,那么这两种方式的区别是什么呢?

let instanceMetaType: String.Type = type(of: "string")
let staicMetaType: String.Type = String.self

.self取到的是静态的元类型,声明的时候是什么类型就是什么类型。type(of:)取到的是运行时候的元类型,也就是这个实例的类型。

Protocol

很多人对protocol的元类型容易理解错。Protocol 自身不是一个类型,只有当一个对象实现了 protocol 后才有了类型对象。如果你写下面的代码会得到一个错误:

protocol MyProtocol { }
let metatype: MyProtocol.Type = MyProtocol.self

正确的理解是 MyProtocol.Type 也是一个有效的元类型,那么就需要是一个可承载的类型的元类型。所以改成这样就可以了:

struct MyType: MyProtocol { }
let metatype: MyProtocol.Type = MyType.self 

那么 Protocol.self 是什么类型呢?为了满足你的好奇心苹果为你造了一个类型:

let protMetatype: MyProtocol.Protocol = MyProtocol.self

相关文章

  • Swift 中的类型

    Swift 中的类型 本文主要介绍Swift中的元类型,其中包含AnyObject、Any、AnyClass、T....

  • swift元类型

    一、元类型(术语表示metaType) 元类型是指所有类型的类型,包括类、结构体、枚举和协议。 类、结构体或枚举类...

  • Swift - 元类型

    Self Self一般作为返回值类型,限定返回值跟方法调用者必须是同一类型(也可以作为参数类型) 这一句为什么不能...

  • Swift-元类型

    Any,AnyObject Any:可以代表任意类型(枚举,结构体,类,函数类型) AnyObject:可以代表任...

  • 思考 Swift 中的 MirrorType 协议

    Swift中的反射非常有限,仅允许以只读方式访问元数据的类型子集。或许 Swift 因有严格的类型检验而不需要反射...

  • Swift--AnyClass初步探索

    Swift 日常笔记碎片知识 AnyClass是一个元类型typealias AnyClass = AnyObje...

  • Swift中数据类型

    Swift中数据类型 标签(空格分隔): Swift Swift类型的介绍 Swift中的数据类型也有:整型/浮点...

  • Swift 元类型和.self

    一、前言 也许 Any 和 AnyObject 你并不陌生,但是你不一定熟悉 AnyClass。 1.1 Any ...

  • Swift中数据类型

    Swift类型的介绍 Swift中的类型推导 Swift中基本运算

  • Swift中的值类型和参照类型

    Swift中的值类型和参照类型 Swift中的值类型和参照类型

网友评论

      本文标题:swift元类型

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