Swift关键知识点13-初始化
00 分钟
2023-9-12
  • 如果属性总是使用相同的初始值,在创建属性时赋值而不是在initializer中赋值。
  • 初始化参数
  • 对于类的实例,常量属性只能在初始化时被定义它的类来赋值,子类不能修改常量属性。
  • Swift给没有定义初始化方法且所有属性都有默认值的类、结构体提供一个默认的初始化方法。
  • Initializer delegation for Value Types:初始化方法可以调用其他初始化方法。值类型可以在初始化方法中通过self.init调用其它初始化方法。
  • 类的designated initializer:每个类至少要有一个designated initializer。一般是初始化所有类的属性并调用一个合适的父类的初始化方法。Convenience initializer是辅助的非必须的初始化方法。
  • Initializer Delegation for Class Types:designated initializers必须调用父类的一个designated initializer;convenience initializers必须调用同个类里的一个initializer;一个convenience initializer必须最终调用一个designated initializer。
notion image
notion image
  • 两阶段初始化:Swift的编译器在初始化时会进行四个安全检查
    • 一个designated initializer必须在delegate up之前初始化所在类定义的所有属性。
    • 一个designated initializer在给继承的属性赋值前必须被delegate up给一个父类的designated initializer,如果不这样做新的值会被父类的designated initializer覆盖。
    • 一个convenience initializer在赋值给任何属性前时必须delegate to另一个initializer。如果不这样做,新的值就会被所在类的designated initializer覆盖。
    • 一个initializer在一阶段初始化完成前不能调用任何实例方法,读取实例属性以及引用self。
  • 当子类定义了一个与父类convenience initializer相同的初始化方法时,不用写override关键字,因为子类不能直接调用父类的convenience initializer。
  • 自动初始化方法继承:假设你已经给子类中所有新的属性都提供了默认值
    • 如果子类没有定义designated initializer,那么默认继承所有父类的designated initializers。
    • 如果子类实施了所有父类的designated initializers(无论是通过上一条规则继承还是自己实施的),那么它自动继承所有父类的convenience initializers。
  • Designated and Convenience Initializers实战
notion image
  • 可失败的初始化方法:在init后写问号代表创建可失败的初始化方法。你不能同时定义参数类型和名称相同的可失败和不可失败的初始化方法。
  • 枚举类的可失败初始化方法
  • 有原始值的枚举类的可失败初始化方法:有原始值的枚举类默认有init?(rawValue:)可失败初始化方法。
  • 初始化失败的传播
  • 重写可失败的初始化方法:子类可以把父类的可失败初始化方法重写为不可失败初始化方法,这种情况下需要force-unwrap父类的初始化方法。
  • init!:创建implicitly unwrapped optional实例的可失败初始化方法。而且可以与init?初始化方法互相重写和delegate。也可以delegate from init to init!。
  • 必须的初始化方法:通过required关键字保证所有子类都要实现该初始化方法。在子类里该初始化方法前也必须写required关键字以保证后续子类继续强制实现该初始化方法。
  • 使用闭包或者函数设置属性默认值:注意()要跟在{}后面,以便告诉Swift立马执行闭包,而不是把闭包赋值给该属性。注意如果你通过闭包来初始化一个属性,你不能在闭包中使用任何其他属性,也不能使用self或者任何实例方法。
 

评论