返回

Initializer in iOS

IOS

iOS 中的 Initializer 是一个特殊的函数,用于初始化对象的属性并将其置于已知状态。与其他语言不同,iOS 中的类使用 designated initializer,它明确指定了对象的属性如何初始化。如果没有提供显式的 designated initializer,编译器会自动创建一个默认的。

Designated Initializer

Designated initializer 是类中唯一可以调用其他 initializer 的 initializer。它必须初始化所有存储属性,并且在子类中不能被覆盖。

class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

Convenience Initializer

Convenience initializer 是一个辅助 initializer,它调用 designated initializer 来初始化对象。它不能初始化所有存储属性,并且可以在子类中被覆盖。

class Person {
    var name: String
    var age: Int

    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }

    convenience init(name: String) {
        self.init(name: name, age: 0)
    }
}

Required Initializer

Required initializer 是一个特殊的 designated initializer,它必须在子类中被实现。它通常用于确保子类遵守某些要求。

class Vehicle {
    var numberOfWheels: Int

    required init(numberOfWheels: Int) {
        self.numberOfWheels = numberOfWheels
    }
}

class Car: Vehicle {
    override init(numberOfWheels: Int) {
        super.init(numberOfWheels: numberOfWheels)
    }
}

Factory Initializer

Factory initializer 是一个静态方法,它返回一个新创建的对象。它通常用于创建复杂对象或管理单例。

class Person {
    static func createPerson(name: String, age: Int) -> Person {
        return Person(name: name, age: age)
    }
}

Understanding the Rules

了解以下规则对于有效使用 initializer 至关重要:

  • Designated initializer 必须初始化所有存储属性。
  • Convenience initializer 不能初始化所有存储属性。
  • Required initializer 必须在子类中被实现。
  • Initializer 不能调用自身。
  • Initializer 不能被覆盖成 convenience initializer。

Conclusion

Initializer 是 iOS 开发中用于初始化对象的重要工具。通过理解不同类型的 initializer 以及它们遵循的规则,您可以创建健壮且可维护的代码。记住,指定和辅助 initializer 之间的区别、required initializer 的作用以及 factory initializer 的便利性,将帮助您有效地利用 iOS 中的 initializer 机制。