Swfit 是不会为 class 生成默认的 init 方法,我们必须明确定义 class 类型的对象创建过程。
我们有两种方式定义默认 init 方法:
- 给每个属性添加默认值
class Point2D {
var x: Double = 0
var y: Double = 0
}
- 为 class 添加一个 memberwise init 方法
class Point2D {
var x: Double
var y: Double
init(x: Double, y: Double) { // 最好是跟上默认参数
self.x = x
self.y = y
}
}
便利构造
在实际开发过程中,我们除了使用 memberwise 的方式创建 Point2D 之外,还能使用如下方式:
let point = Point2D(at: (2.0, 2.0))
这是我们就需要把参数 (2.0,2.0) 分解为 Point2D 的每一个属性,然后调用 designated init 方法。
class Point2D {
// ...
convenience init(at: (Double, Double)) {
self.init(x: at.0, y: at.1)
}
}
convenience init 的两个要素
- 必须显式使用 convenience 修饰
- 不能在方法内部出现
self.
以上的 init 方法都有一个共性:参数一定可以用来初始化 class 的属性。但是如果在 convenience init 中参数分解后,无法传递给 designated init ,这个 init 方法就会失败。