在 Swift
的使用中,我们可能会经常看到 .self
、.Type
、type(of:)
,尤其是 .self
用的是比较多的,下面来一起介绍一下他们都是什么
.self
、.Type
、type(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
转换来比较类型是否一致
.self
与 type(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)