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 "@"!