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

What are initializers in Swift? What are designated initializers, convenience initializers, and failable initializers?

2月21日 15:07

What are initializers in Swift? What are designated initializers, convenience initializers, and failable initializers?

Initializers in Swift are used to create new instances of classes, structs, or enums. Initializers ensure that all stored properties have appropriate initial values before use and perform other necessary setup.

Basic Concepts of Initializers:

  • Defined using the init keyword
  • No func keyword needed
  • Can have parameters
  • Can be overloaded
  • Ensures instances are fully initialized before use

Designated Initializers:

  • The primary initializers of a class
  • Fully initialize all introduced properties
  • Call the superclass's designated initializer
  • Each class must have at least one designated initializer
  • Example:
    swift
    class Vehicle { var numberOfWheels: Int var maxSpeed: Int init(numberOfWheels: Int, maxSpeed: Int) { self.numberOfWheels = numberOfWheels self.maxSpeed = maxSpeed } }

Convenience Initializers:

  • Auxiliary initializers that provide convenient initialization
  • Must call another initializer in the same class
  • Must ultimately call a designated initializer
  • Marked with the convenience keyword
  • Example:
    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") } }

Failable Initializers:

  • Initializers that may return nil
  • Defined using init? or init!
  • Return nil when initialization fails
  • Example:
    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)

Initializer Rules:

  1. Designated initializers must call the superclass's designated initializer
  2. Convenience initializers must call another initializer in the same class
  3. Cannot access instance methods or properties before initialization is complete
  4. Must initialize current class properties before calling superclass initializer

Two-Phase Initialization:

swift
class Base { var value: Int init(value: Int) { // Phase 1: Initialize current class properties self.value = value // Phase 2: Call superclass initializer // For base class, no superclass } } class Derived: Base { var extra: Int init(value: Int, extra: Int) { // Phase 1: Initialize current class properties self.extra = extra // Phase 2: Call superclass initializer super.init(value: value) // Now can access instance methods } }

Required Initializers:

  • Marked with the required keyword
  • All subclasses must implement this initializer
  • Example:
    swift
    class SomeClass { required init() { // Initialization code } } class SubClass: SomeClass { required init() { // Must implement } }

Best Practices:

  1. Reasonably use designated and convenience initializers
  2. Use failable initializers to handle invalid input
  3. Follow two-phase initialization rules
  4. Avoid calling instance methods in initializers
  5. Use required initializers to ensure subclass consistency
标签:Swift