乐闻世界logo
搜索文章和话题

Swift 中的初始化器是什么?什么是指定初始化器、便利初始化器和可失败初始化器?

2月21日 15:07

Swift 中的初始化器是什么?什么是指定初始化器、便利初始化器和可失败初始化器?

Swift 中的初始化器用于创建类、结构体或枚举的新实例。初始化器确保所有存储属性在使用前都有合适的初始值,并执行其他必要的设置。

初始化器的基本概念:

  • 使用 init 关键字定义
  • 不需要 func 关键字
  • 可以有参数
  • 可以重载
  • 确保实例完全初始化后才能使用

指定初始化器:

  • 类的主要初始化器
  • 完全初始化所有引入的属性
  • 调用父类的指定初始化器
  • 每个类至少有一个指定初始化器
  • 示例:
    swift
    class Vehicle { var numberOfWheels: Int var maxSpeed: Int init(numberOfWheels: Int, maxSpeed: Int) { self.numberOfWheels = numberOfWheels self.maxSpeed = maxSpeed } }

便利初始化器:

  • 辅助初始化器,提供便捷的初始化方式
  • 必须调用同一个类中的其他初始化器
  • 最终必须调用指定初始化器
  • 使用 convenience 关键字标记
  • 示例:
    swift
    class Car: Vehicle { var brand: String init(brand: String, numberOfWheels: Int, maxSpeed: Int) { self.brand = brand super.init(numberOfWheels: numberOfWheels, maxSpeed: maxSpeed) } convenience init(brand: String) { self.init(brand: brand, numberOfWheels: 4, maxSpeed: 200) } convenience init() { self.init(brand: "Unknown") } }

可失败初始化器:

  • 可能返回 nil 的初始化器
  • 使用 init?init! 定义
  • 在初始化失败时返回 nil
  • 示例:
    swift
    struct Temperature { let celsius: Double init?(celsius: Double) { if celsius < -273.15 { return nil } self.celsius = celsius } init?(fahrenheit: Double) { let celsius = (fahrenheit - 32) * 5 / 9 if celsius < -273.15 { return nil } self.celsius = celsius } } let validTemp = Temperature(celsius: 25) let invalidTemp = Temperature(celsius: -300)

初始化器规则:

  1. 指定初始化器必须调用父类的指定初始化器
  2. 便利初始化器必须调用同一个类中的其他初始化器
  3. 在初始化完成前不能访问实例方法或属性
  4. 必须先初始化当前类的属性,再调用父类初始化器

两段式初始化:

swift
class Base { var value: Int init(value: Int) { // 第一阶段:初始化当前类属性 self.value = value // 第二阶段:调用父类初始化器 // 对于基类,没有父类 } } class Derived: Base { var extra: Int init(value: Int, extra: Int) { // 第一阶段:初始化当前类属性 self.extra = extra // 第二阶段:调用父类初始化器 super.init(value: value) // 现在可以访问实例方法 } }

必需初始化器:

  • 使用 required 关键字标记
  • 所有子类必须实现该初始化器
  • 示例:
    swift
    class SomeClass { required init() { // 初始化代码 } } class SubClass: SomeClass { required init() { // 必须实现 } }

最佳实践:

  1. 合理使用指定初始化器和便利初始化器
  2. 使用可失败初始化器处理无效输入
  3. 遵循两段式初始化规则
  4. 避免在初始化器中调用实例方法
  5. 使用必需初始化器确保子类一致性
标签:Swift