元类型
元类型是指任意类型的类型,包括类类型、结构体类型、枚举类型和协议类型。
类、结构体、枚举: XXX.Type
协议: xxxx.Protocol
获取
SomeClass.Self
SomeProtocol.Self
type(of:)
class SomeBaseClass {
class func printClassName() {
println("SomeBaseClass")
}
}
class SomeSubClass: SomeBaseClass {
override class func printClassName() {
println("SomeSubClass")
}
}
let someInstance: SomeBaseClass = SomeSubClass()
// someInstance 在编译期是 SomeBaseClass 类型,
// 但是在运行期则是 SomeSubClass 类型
type(of: someInstance).printClassName()
// 打印“SomeSubClass”
从元类型生成实例
可以使用初始化表达式从某个类型的元类型构造出一个该类型的实例。对于类实例,被调用的构造器必须使用 required 关键字标记,或者整个类使用 final 关键字标记。
class AnotherSubClass: SomeBaseClass {
let string: String
required init(string: String) {
self.string = string
}
override class func printClassName() {
print("AnotherSubClass")
}
}
let metatype: AnotherSubClass.Type = AnotherSubClass.self
let anotherInstance = metatype.init(string: "some string")
自身类型
Self 类型不是具体的类型,而是让你更方便的引用当前类型,不需要重复或者知道该类的名字。
在协议声明或者协议成员声明时,Self 类型引用的是最终遵循该协议的类型。
在结构体,类或者枚举值声明时,Self 类型引用的是声明的类型。
在类成员声明时,Self 只能在以下几种情况中出现:
- 作为方法的返回类型
- 作为只读下标的返回类型
- 作为只读计算属性的类型
- 在方法体中
类型推断
Swift 中的类型推断在单独的表达式或语句上进行。这意味着所有用于类型推断的信息必须可以从表达式或其某个子表达式的类型检查中获取到。