Initialization Patterns in Swift

From the Swift cheat sheet · Initialization · verified Jul 2026

Initialization Patterns

Designated, convenience, and failable initializers

swift
// Designated initializer
class Vehicle {
    var wheels: Int
    var maxSpeed: Double

    // Designated initializer
    init(wheels: Int, maxSpeed: Double) {
        self.wheels = wheels
        self.maxSpeed = maxSpeed
    }

    // Convenience initializer
    convenience init(wheels: Int) {
        self.init(wheels: wheels, maxSpeed: 100.0)
    }
}

// Failable initializer
struct Animal {
    let species: String

    init?(species: String) {
        guard !species.isEmpty else {
            return nil
        }
        self.species = species
    }
}

// Required initializer
class BaseClass {
    required init() {
        // Subclasses must implement
    }
}

class SubClass: BaseClass {
    required init() {
        super.init()
    }
}
💡 Designated initializers must initialize all properties
⚡ Convenience initializers must call another initializer
📌 Failable initializers return nil on failure
🟢 Use lazy properties for expensive initialization
Back to the full Swift cheat sheet