Lesson 54Structs

Initializers

What are Initializers?

Initializers set up new instances. Swift auto-generates a memberwise initializer, but you can create custom ones!

Initializer Types

MemberwiseAuto-generated by Swift
CustomDefine your own logic
Failable (init?)Returns nil if invalid
DelegatingCalls another initializer

Failable Initializers

Use init? when initialization might fail. Returns nil if validation fails!

main.swift
// STRUCT INITIALIZERS
// Initializers set up a new instance with initial values

// MEMBERWISE INITIALIZER (Auto-generated)
struct Point {
    var x: Double
    var y: Double
}
let p1 = Point(x: 10, y: 20)  // Auto-generated!

// CUSTOM INITIALIZERS
struct Person {
    var name: String
    var age: Int

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

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

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

let p1 = Person(name: "Alice", age: 25)
let p2 = Person(name: "Bob", birthYear: 1995)
print(p2.age)  // 29

// FAILABLE INITIALIZERS
struct Product {
    var name: String
    var price: Double

    init?(name: String, price: Double) {
        guard !name.isEmpty else { return nil }
        guard price >= 0 else { return nil }
        self.name = name
        self.price = price
    }
}

let valid = Product(name: "iPhone", price: 999)
let invalid = Product(name: "", price: 100)  // nil

// MULTIPLE INITIALIZERS
struct Rectangle {
    var width: Double
    var height: Double

    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }

    init(side: Double) {
        self.width = side
        self.height = side
    }

    init() {
        self.width = 0
        self.height = 0
    }
}

let rect = Rectangle(width: 10, height: 5)
let square = Rectangle(side: 7)
let empty = Rectangle()

// INITIALIZER DELEGATION
struct Size {
    var width: Double
    var height: Double

    init(width: Double, height: Double) {
        self.width = width
        self.height = height
    }

    init(square side: Double) {
        self.init(width: side, height: side)
    }
}

Try It Yourself!

Create a User struct with a failable initializer that validates email contains "@"!