クラスより構造体が利用される理由 Swift


インターン先でclassよりstructを使っているまたはみる回数のほうが多いような気がした。
柑橘系でくらべてみました。

クラスより構造体が利用される理由

クラスは参照型名ため、インスタンスが引数として渡されたとき、そのインスタンスの参照が渡されるから下のような場合、プロパティの値を変更すると両方のインスタンスに影響されてしまう。

class Food {
    var number: Int = 0
}

class Fruit {
    var citrusFruit: Food
    init(citrusFruit: Food) {
        self.citrusFruit = citrusFruit
    }
}

let citrusFruit = Food()
citrusFruit.number = 5
let orange = Fruit(citrusFruit: citrusFruit)
citrusFruit.number = 10
let lemon = Fruit(citrusFruit: citrusFruit)
orange.citrusFruit.number // 10
lemon.citrusFruit.number // 10

逆に、構造体は値型なので、インスタンスが引数として渡されるとき、その参照ではなくて値そのものが渡されるから、それぞれのインスタンスは別々のインスタンスを保持できる。


struct Food {
    var number: Int = 0
}

struct Fruit {
    var citrusFruit: Food
}

var citrusFruit = Food()
citrusFruit.number = 5
let orange = Fruit(citrusFruit: citrusFruit)
citrusFruit.number = 10
let lemon = Fruit(citrusFruit: citrusFruit)
orange.citrusFruit.number // 5
lemon.citrusFruit.number // 10

クラスを利用するときは参照を共有する必要があるときと、インスタンスのライフサイクルと合わして処理を実行するとき!