【Swift/SwiftUI】ゲッターとセッター

本記事では、多くのプログラム言語で利用されてるゲッターとセッターをSwiftで使用する方法を解説していきます。

ゲッター/セッターとは

ゲッターは、構造体などのプロパティにアクセスしてその値を取得する為に使用できる機能です。

セッターは構造体などのプロパティにアクセスし、値を設定することができる機能です。

ゲッターやセッターを明示的に記述しなくてもプロパティの値の読み取りや設定を行うことができますが、記述することで呼び出しや書き出しの処理をカスタマイズすることが可能になります。

セッターとゲッターを用意する際には必ず使用しなくてはいけないわけではなく、どちらか一方のみを用意することも可能です。

ゲッターの使い方

ゲッターを用意する際には、get{}を記述します。

今回は「CalcData」という構造体を定義し、その中でnumberとゲッターを持つcalcNumberプロパティを用意します。

struct CalcData {
    var number: Int
    
    var calcNumber: Int {
        get {
            return number * 2
        }
    }
}

一般的なプロパティの定義の後に波括弧をつけ、その中にゲッターとreturnで返却値を入れます。

var data = CalcData(number: 10)
print("初期値: \(data.number)")         //初期値: 10
print("ゲッター使用: \(data.calcNumber)")   //ゲッター使用: 20

numberプロパティを取得すると通常通りに代入した10が返却されます。

ゲッターを用意したcalcNumberプロパティを取得すると、getが使用されてnumberを2倍した値を返却することが確認できました。

セッターの使い方

セッターを用意する際には、set{}を記述します。ゲッターを追加していたcalcNumberプロパティにセッターを追加していきます。

struct CalcData {
    var number: Int
    
    var calcNumber: Int {
        get {
            return number * 2
        }
        set {
            number = newValue * 3
        }
    }
}

セッターはプロパティ内にsetを用意し、その中で与えられたパラメータを使用して代入処理を行います。上の例では、numberプロパティにパラメータを3倍した値を代入しています。

セッターでは、明示的にパラメータを受け取る記述をしなくても「newValue」という変数名でパラメータを受け取ることができます。

var data = CalcData(number: 10)
data.calcNumber = 20
print("セッター使用後のnumber: \(data.number)")         //セッター使用後のnumber: 60
print("セッター使用後のcalcNumber: \(data.calcNumber)")   //セッター使用後のcalcNumber: 120

セッター使用後に各プロパティを取得してみると、numberは3倍の60になっており、calcNumberはその2倍の120に変わっていることが確認できます。

ゲッターやセッターを用意していない場合

構造体などでゲッターやセッターの記述を行わなくてもプロパティの値を取得・代入することはできます。

明示的にセッター/ゲッターの記述がない場合には、コンパイラが自動で以下のようなシンプルなゲッターとセッターを用意してくれているためです。

var number: Int {
        get {
            return _number
        }
        set {
            _number = newValue
        }
    }

最後に

本記事ではゲッターとセッターの定義と使用方法について解説しました。

カスタマイズする必要がない場合には定義しなくても良いかもしれません。

しかし、定義していない場合でもプロパティの取得や代入を行うと、裏ではゲッターやセッターが機能していることを理解できると今後のプログラミングの理解も進みやすくなると思います!

他にも構造体の定義と利用方法や関数の宣言方法などについても解説する記事を書いていますのでぜひそちらもご確認ください。