Swift中.Type、.self、type(of:)

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)

猜你喜欢

转载自juejin.im/post/7126161571226583054