Blog / July 28, 2023 / 3 mins read / By Mahi Garg

Super in Swift

In the dynamic world of Swift programming, the super keyword serves as a bridge connecting the past and present—enabling seamless inheritance and collaboration between parent and child classes. Understanding the capabilities of the super keyword is essential for effective object-oriented design and maintaining code coherence. In this blog, we’ll dive deep into the intricacies of the super keyword in Swift, illustrated through practical examples.

Decoding the super Keyword

At its essence, the super keyword in Swift refers to the parent class or superclass. It provides a mechanism for accessing and invoking methods, properties, and initializers of the parent class within a subclass.

Using super to Access Overridden Methods

In an inheritance hierarchy, subclasses can override methods defined in their parent class. The super keyword plays a pivotal role in calling the overridden implementation of the method. Let’s consider a scenario involving geometric shapes:

class Shape {
    var description: String {
        return "This is a shape."
    }
}

class Circle: Shape {
    var radius: Double
    
    init(radius: Double) {
        self.radius = radius
    }
    
    override var description: String {
        return super.description + " It is a circle with radius \(radius)."
    }
}

let circle = Circle(radius: 5.0)
print(circle.description)

In this example, the super keyword is used within the overridden description property of the Circle class to access and extend the behavior of the parent class’s description.

Invoking Superclass Initializers

Subclasses often have their own specialized initializers, but they can also inherit initializers from their parent class. The super keyword allows you to invoke the initializer of the superclass, enabling a streamlined initialization process. Let’s explore a scenario involving a Vehicle superclass and a Car subclass:

class Vehicle {
    var make: String
    
    init(make: String) {
        self.make = make
    }
}

class Car: Vehicle {
    var model: String
    
    init(make: String, model: String) {
        self.model = model
        super.init(make: make)
    }
}

let car = Car(make: "Toyota", model: "Corolla")
print("Car: \(car.make) \(car.model)")

By using super.init(make: make) within the Car subclass’s initializer, we invoke the Vehicle class’s initializer to initialize the common property.

Collaborating with Parent Class Methods

The super keyword is not limited to properties and initializers—it can also be used to call methods defined in the parent class. Let’s explore an example involving a BankAccount superclass and a SavingsAccount subclass:

class BankAccount {
    var balance: Double
    
    init(balance: Double) {
        self.balance = balance
    }
    
    func deposit(amount: Double) {
        balance += amount
    }
}

class SavingsAccount: BankAccount {
    var interestRate: Double
    
    init(balance: Double, interestRate: Double) {
        self.interestRate = interestRate
        super.init(balance: balance)
    }
    
    func addInterest() {
        let interest = balance * interestRate
        deposit(amount: interest)
    }
}

let savingsAccount = SavingsAccount(balance: 1000.0, interestRate: 0.05)
savingsAccount.addInterest()
print("Updated Balance: \(savingsAccount.balance)")

In this example, the super.init(balance: balance) call initializes the SavingsAccount subclass with the initial balance from the BankAccount superclass.

Conclusion

The super keyword in Swift serves as a bridge that spans the inheritance hierarchy, facilitating collaboration between parent and child classes. From accessing overridden methods and properties to invoking superclass initializers and methods, the super keyword empowers you to create structured, maintainable, and efficient code. By mastering the art of using “super,” you’ll unlock the full potential of inheritance and object-oriented programming in Swift, enabling you to build robust and cohesive software solutions. Happy coding! 🚀

Comments