Nesting various types within classes can be a powerful way to organize your code. This technique allows you to encapsulate related functionality and data within a single, cohesive unit. In this post, we'll explore how to nest classes, structs, enums, and protocols within classes in Swift.
Nesting types can help you:
Let's start by nesting a struct within a class. Structs are value types, which means they are copied when passed around. This can be useful for small, simple data structures.
class Hero {
    var name: String
    var power: String
    init(name: String, power: String) {
        self.name = name
        self.power = power
    }
    struct Stats {
        var strength: Int
        var agility: Int
        var intelligence: Int
    }
}
let hero = Hero(name: "Superman", power: "Flight")
let heroStats = Hero.Stats(strength: 100, agility: 80, intelligence: 90)
print("Hero: \(hero.name), Power: \(hero.power)")
print("Stats - Strength: \(heroStats.strength), Agility: \(heroStats.agility), Intelligence: \(heroStats.intelligence)")
In this example, we have a Hero class with a nested Stats struct. The Stats struct holds the hero's attributes.
Classes are reference types, which means they are passed by reference. This can be useful for more complex data structures that need to share state.
class Hero {
    var name: String
    var power: String
    init(name: String, power: String) {
        self.name = name
        self.power = power
    }
    class Equipment {
        var weapon: String
        var armor: String
        init(weapon: String, armor: String) {
            self.weapon = weapon
            self.armor = armor
        }
    }
}
let hero = Hero(name: "Batman", power: "Intelligence")
let heroEquipment = Hero.Equipment(weapon: "Batarang", armor: "Kevlar Suit")
print("Hero: \(hero.name), Power: \(hero.power)")
print("Equipment - Weapon: \(heroEquipment.weapon), Armor: \(heroEquipment.armor)")
In this example, we have a Hero class with a nested Equipment class. The Equipment class holds the hero's gear.
Enums are useful for defining a common type for a group of related values. Let's see how to nest an enum within a class.
class Hero {
    var name: String
    var power: String
    init(name: String, power: String) {
        self.name = name
        self.power = power
    }
    enum HeroType {
        case warrior
        case mage
        case archer
    }
}
let hero = Hero(name: "Legolas", power: "Archery")
let heroType = Hero.HeroType.archer
print("Hero: \(hero.name), Power: \(hero.power), Type: \(heroType)")
In this example, we have a Hero class with a nested HeroType enum. The HeroType enum defines different types of
heroes.
Protocols define a blueprint of methods, properties, and other requirements that suit a particular task or piece of functionality. Let's see how to nest a protocol within a class.
class Hero {
    var name: String
    var power: String
    init(name: String, power: String) {
        self.name = name
        self.power = power
    }
    protocol HeroActions {
        func attack()
        func defend()
    }
    class Warrior: HeroActions {
        func attack() {
            print("Warrior attacks!")
        }
        func defend() {
            print("Warrior defends!")
        }
    }
}
let warrior = Hero.Warrior()
warrior.attack()
warrior.defend()
In this example, we have a Hero class with a nested HeroActions protocol. The Warrior class conforms to the
HeroActions protocol and implements its methods.
Nesting classes, structs, enums, and protocols within other classes can help you write more organized and maintainable code. Use this technique to encapsulate related functionality and avoid naming conflicts. Happy coding!
                        Effect UI for
your next project
                    
We are a team of talented designers making iOS components to help developers build outstanding apps faster with less effort and best design.