元类型、AnyClass、Self

优质
小牛编辑
126浏览
2023-12-01

元类型、Type、Self

AnyObject

  • 代表任意类的instance, 也就是实例对象
  • 类的类型
  • 仅类遵守的协议 (Class-Only Protocols)

Any

  • 代表任意类型, 包括functionoptional类型

AnyClass

  • 代表任意实例的类型: AnyObject.Type

    public typealias AnyClass = AnyObject.Type

T.self

  • 如果T是实例对象, T.self 返回的就是它本身
  • 如果T是类, 那么 T.self 返回的就是Metadata

T.Type

  • 一种类型, T.selfT.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)处理后, 即可获取到真实类型