元类型、AnyClass、Self
优质
小牛编辑
145浏览
2023-12-01
元类型、Type、Self
AnyObject
- 代表任意类的
instance
, 也就是实例对象 - 类的类型
- 仅类遵守的协议 (Class-Only Protocols)
Any
- 代表任意类型, 包括
function
和optional
类型
AnyClass
代表任意实例的类型:
AnyObject.Type
public typealias AnyClass = AnyObject.Type
T.self
- 如果
T
是实例对象,T.self
返回的就是它本身 - 如果
T
是类, 那么T.self
返回的就是Metadata
T.Type
- 一种类型,
T.self
是T.Type
类型
type(of:)
- 用来获取一个值的动态类型
Tips
- 类
class Person {
var age: Int = 1
}
func test(_ value: Any) {
print(type(of: value))
}
let p = Person()
test(p) // 此时输出: Person, 编译期间是Any类型, 运行时获取到了实际类型
- 协议
protocol Sayable: AnyObject {
}
class Person: Sayable {
var age: Int = 1
}
func test(_ value: Sayable) {
let valueType = type(of: value)
print(valueType)
}
let p1 = Person()
let p2: Sayable = Person()
test(p1) // Person
test(p2) // Person
- 协议&泛型
protocol Sayable: AnyObject {
}
class Person: Sayable {
var age: Int = 1
}
func test<T>(_ value: T) {
let valueType = type(of: value)
print(valueType)
}
let p1 = Person()
let p2: Sayable = Person()
test(p1) // Person
test(p2) // Sayable
有协议&泛型的参与, 默认情况下type(of:)
无法拿到真实类型
通过type(of: value as Any)
处理后, 即可获取到真实类型