Swift 的运用中,咱们或许会经常看到 .self.Typetype(of:),尤其是 .self 用的是比较多的,下面来一起介绍一下他们都是什么

.self.Typetype(of:)

.self: 指的是咱们运用的类本身(类目标),由类名直接调用,表示静态的类目标,留意:不是由该类创立的目标

.Type: 便是咱们运用的类(类目标)的类型,又叫元类型,他表示咱们当前类的类型

type(of:) : 根据传入的目标,来动态返回其所属类(类目标),究竟目标能够强制类型转换,实践归于什么类,只有在运行时才干知道是什么类型

.self.Type

了解上面的 .self.Type,只需要把 .self 换成目标 .Type 换成类,信任就立即理解其关系了

举个比如:

func isMyCell<T: LSTableViewCell>(type: T.Type) -> T? {
    if let cellType = type as? LSTableViewGifCell.Type {
        //将 type 转换为 LSTableViewGifCell 类型,假如成功阐明是该类型
        //这儿我传递过来的cell是LSTableViewCell的子类,判别是否是gif类型,用来显示gif
        return LSTableViewGifCell(placeholder: "placeholder")
    }else if let cellType = type as? LSTableViewTextCell.Type {
        //将 type 转换为 LSTableViewTextCell 类型,假如成功阐明是该类型
        //这儿我传递过来的cell是LSTableViewCell的子类,判别是否是text类型,用来显示纯文本的
        return LSTableViewTextCell()
    }
    return nil
}

平时咱们判别类型一般是 is 或者 isKindOf,这是目标判别所属类的方式,上面是是同类型比较,选用 as 转换来比较类型是否一致

.selftype(of:)

.self 获取固定的类目标, type(of:) 根据目标动态获取真实的类目标

举个比如:

//直接指定固定类型,不会在改变
JSONDecode().decode(SimpleModel.self, from: data)
//Student 承继自 Person,这只是比较直观的,你觉得下面两个type相同么?
var person1 = Person()
let type1 = type(of: person1)
person1 = Student()
let type2 = type(of: person1)