前言:
通常,我们要自定义个View都可以使用init 关键字来初始化。
当然,初始化是为
类、结构体或者枚举
准备实例的过程。这个过需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其他所必须的配置或初始化。
struct Celsius {
var temperatureInCelsius: Double
init(fromFahrenheit fahrenheit: Double) {
temperatureInCelsius = (fahrenheit - 32.0) / 1.8
}
init(fromKelvin kelvin: Double) {
temperatureInCelsius = kelvin - 273.15
}
}
let boilingPointOfWater = Celsius(fromFahrenheit: 212.0)
// boilingPointOfWater.temperatureInCelsius is 100.0
let freezingPointOfWater = Celsius(fromKelvin: 273.15)
// freezingPointOfWater.temperatureInCelsius is 0.0
Size结构体自动接收一个 init(width:heght:)成员初始化器,你可以使用它来初始化一个新的 Size实例:
struct Size {
var width = 0.0, height = 0.0
}
let twoByTwo = Size(width: 2.0, height: 2.0)
指定初始化器和便捷初始化器语法
1.用与值类型的简单初始化器相同的方式来写类的指定初始化器
2.便捷初始化器有着相同的书写方式,但是要用 convenience修饰符放到 init 关键字前,用空格隔开:
convenience init(parameters) {
statements
}
初始化器的继承和重写
不像在 Objective-C 中的子类,Swift 的子类不会默认继承父类的初始化器。Swift 的这种机制防止父类的简单初始化器被一个更专用的子类继承并被用来创建一个没有完全或错误初始化的新实例的情况发生。
当你写的子类初始化器匹配父类指定初始化器的时候,你实际上可以重写那个初始化器。因此,在子类的初始化器定义之前你必须写 override 修饰符。如同默认初始化器所描述的那样,即使是自动提供的默认初始化器你也可以重写。
当重写父类指定初始化器时,你必须写 override 修饰符,就算你子类初始化器的实现是一个便捷初始化器。
可失败初始化器 init!
通常来讲我们通过在 init关键字后添加问号 ( init?)的方式来定义一个可失败初始化器以创建一个合适类型的可选项实例。另外,你也可以使用可失败初始化器创建一个隐式展开具有合适类型的可选项实例。通过在 init后面添加惊叹号( init!)是不是问号。
你可以在 init? 初始化器中委托调用 init! 初始化器,反之亦然。 你也可以用 init!重写 init?,反之亦然。 你还可以用 init委托调用 init!,尽管当 init!初始化器导致初始化失败时会触发断言。
必要初始化器
在类的初始化器前添加 required修饰符来表明所有该类的子类都必须实现该初始化器: