13-Swift初始化器

2020-12-17  本文已影响0人  一抹相思泪成雨

1.初始化器

- 每个类至少有一个指定初始化器,指定初始化器是类的主要初始化器 
- 默认初始化器总是类的指定初始化器
- 类偏向于少量指定初始化器,一个类通常只有一个指定初始化器

/*
 // 指定初始化器
 init(parameters) {
    statements
 }

初始化器的相互调用规则 :
指定初始化器必须从它的直系父类调用指定初始化器 
便捷初始化器必须从相同的类里调用另一个初始化器 
便捷初始化器最终必须调用一个指定初始化器
 // 便捷初始化器
 convenience init(parameters) {
    statements
 }
 */

2.两段式初始化

3.安全检查

4.重写

5.自动继承

6.required

class Person {
    required init() { }
    init(age: Int) { }
}
class Student: Person {
    required init() {
        super.init()
    }
} 

7.属性观察器

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

class Student1: Person1 {
    override init() {
        super.init()
        self.age = 1
    }
}
// willSet 1
// didSet 0 1
var stu = Student1()

8.可失败初始化器

class Person2 {
    var name: String
    init?(name: String) {
        if name.isEmpty {
            return nil
        }
        self.name = name
    }
}
var num123 = Int("123")
public init?(_ description: String)

/// 不允许同时定义参数标签、参数个数、参数类型相同的可失败初始化器和非可失败初始化器
/// 可以用init!定义隐式解包的可失败初始化器
/// 可失败初始化器可以调用非可失败初始化器,非可失败初始化器调用可失败初始化器需要进行解包
/// 如果初始化器调用一个可失败初始化器导致初始化失败,那么整个初始化过程都失败,并且之后的代码都停止执行
/// 可以用一个非可失败初始化器重写一个可失败初始化器,但反过来是不行的

9.反初始化器

class TestPerson {
    deinit {
        print("TestPerson对象销毁了")
    }
}
上一篇 下一篇

猜你喜欢

热点阅读