Swift进阶(九)初始化器

2021-01-19  本文已影响0人  Jax_YD

初始化器

// 指定初始化器
init(parameters) {
    statements
}
// 便捷初始化器
convenience init(parameters) {
    statements
}
class Size {
    var width: Int
    var height: Int
    convenience init(width: Int, height: Int) {
        self.init()
        self.width = width
        self.height = height
    }
}

当然我们也可以自定义指定初始化器,把一些主要的代码放到指定初始化器里面,其他的非必要信息用便捷初始化器来做:

class Size {
    var width: Int
    var height: Int
    ///指定初始化器(保证初始化的时候,width & height都有值)
    init(width: Int, height: Int) {
        self.width = width
        self.height = height
        /**
         此处省略一千行代码
         实际开发中的一些业务必须的业务逻辑可以放在这里
         */
    }
    
    ///便捷初始化器,为用户提供特殊的初始化,并且保证初始化不会出错
    convenience init(width: Int) {
        self.init(width: width, height: 0)
    }
}

var s1 = Size(width: 10, height: 30)
var s2 = Size(width: 10)

初始化器的相互调用

image.png
image.png
这一套规则保证了,使用任意初始化器,都可以完整的初始化实例

两段式初始化 & 安全检查

\color{orange}{两段式初始化}

\color{orange}{安全检查}

重写

class Person {
    var age: Int
    init(age: Int) {
        self.age = age
    }
    
    convenience init() {
        self.init(age: 18)
    }
}

class Man: Person {
    var weight: Int
    init(weight: Int) {
        self.weight = 78
        super.init(age: 18)
    }
    override convenience init(age: Int) {
        self.init(weight: 70)
        self.age = 16
    }
    convenience init() {
        self.init(weight: 56)
    }
}

自动继承

① 如果子类\color{orange}{没有}自定义任何指定初始化器,它会自动继承父类\color{orange}{所有的}指定初始化器
② 如果子类提供了父类所有的指定初始化器的实现(要么通过方式①继承,要么重写),那么子类自动继承所有的父类便捷初始化器
③ 就算子类添加了更多的便捷初始化器,这些规则仍然适用
子类便捷初始化器的形式重写父类指定初始化器,也可以作为满足规则②的一部分

required

class Person {
    var age: Int
    required init(age: Int) {
        self.age = age
    }
}

class Man: Person {
    var weight: Int
    required init(age: Int) {
        self.weight = 56
        super.init(age: 18)
    }
}

属性观察器

class Person {
    var age: Int {
        willSet {
            print("willSet", newValue)
        }
        didSet {
            print("didSet", oldValue, age)
        }
    }
    init() {
        self.age = 18
    }
}

class Man: Person {
    override init() {
        super.init()
        self.age = 20
    }
}

var m = Man()
/*输出结果*/
willSet 20
didSet 18 20

可失败初始化器

class Person {
    var name: String
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
}

反初始化器(deinit)

class Person {
    var name: String
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
    
    deinit {
        print("Person对象销毁了")
    }
}
class Person {
    var name: String
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
    
    deinit {
        print("Person对象销毁了")
    }
}

class Man: Person {
    deinit {
        print("Man对象销毁了")
    }
}

var m = Man(name: "Devid")
m = nil
/*输出结果*/
Man对象销毁了
Person对象销毁了
上一篇 下一篇

猜你喜欢

热点阅读