关键词:swift, 构造器, init, required
概述
- 类、结构体或枚举类型,使用实例前的准备过程。
- 可以自定义参数。
- 可以在构造器里给常量属性赋值。
- 可以在一个便利构造器里调用其他构造器。
- 默认情况下,子类不会继承父类的构造器。但是当子类没有实现任何构造器时,会自动继承父类的所有构造器。
与OC不一样的地方:
- swift的构造器没有返回值,它的作用是使实例在使用前完成正确的初始化。
- swift的子类默认不会继承父类的构造器。
构造器在创建某个特定类型的新实例时被调用。以 init 命名。
//最简形式,一个无形参的实例方法。
init() {
// 在此处执行构造过程
}
自定义构造过程
就是自定义init方法,自己随意加一些参数,传进构造器里。
init(name: String, size: Float) {
print("这是在自定义构造器里:name:\(name) size:\(size)")
}
给常量属性赋值
class FileClass {
let name: String
init() {
print("这里是在极简构造器里")
//可以在构造器里给常量赋值
self.name = "aa"
}
}
指定构造器
- 每个类必须至少有一个指定构造器。
- 指定构造器会被自动继承。
- 创建实例时构造过程会沿父类链往上进行。
init(parameters) {
statements
}
便利构造器
- 写法与指定构造器一样,加关键词convenience修饰。
- 在便利构造器里必须调用同类中的其他构造器。
- 便利构造器的最后,必须调用指定构造器。
convenience init(name: String, size: Float) {
print("这是在自定义构造器里:name:\(name) size:\(size)")
//可以在构造器里调用另一个构造器
self.init(name: "zzz")
}
构造器的重写
重写指定构造器时,必须加override修饰。 重写便利构造器时,不需要加override修饰。 子类不能直接调用父类的便利构造器。确切的说,子类不能继承父类的便利构造器,不存在重写。
构造器的自动继承
默认情况下,子类不会继承父类的构造器。但是当子类没有实现任何构造器时,会自动继承父类的所有构造器。
class MovieFileClass: FileClass {
}
可失败构造器
用init?表示,返回一个自身类型的可选对象。 子类的可失败构造器也能向上代理到父类的可失败构造器。
struct Animal {
let species: String
init?(species: String) {
if species.isEmpty {
return nil
}
self.species = species
}
}
必要构造器
添加 required 修饰,该类的所有子类都必须实现该构造器。
class SomeClass {
required init() {
// 构造器的实现代码
}
}
//重写必要构造器时,不需要加override修饰。
class SomeSubclass: SomeClass {
required init() {
// 构造器的实现代码
}
}
通过闭包或函数设置属性的默认值
闭包后面()的作用是,立即执行前面的闭包。
class SomeClass {
let someProperty: SomeType = {
// 在这个闭包中给 someProperty 创建一个默认值
// someValue 必须和 SomeType 类型相同
return someValue
}()
}