Swift getter setterの処理-セッターゲッターとは

ゲッター、セッターとはそもそも何か?

コンピューテッドプロパティといって、値を保持せずに、算出するプロパティのこと。

??となるので、まずコードを参照。

コンピューテッドプロパティの定義はこのように記載

var プロパティ名:型名{
get{
      値を返す処理
    }
set{
    値を更新する処理
    代入された値にはnewValueとしてアクセス可能
    }
}

実際に書いてみる

class Item {

    // 税抜き価格
    var price:Double = 0

    // 税込み価格
    var intaxPrice:Double {

        // 値を取得するときに呼ばれる。
        get{
            return self.price*1.08
        }

        // 値がセットされるときに呼ばれる。
        set{
            price = newValue/1.08
        }
    }

}

これを実行するとこうなる。

var item = Item()

item.intaxPrice = 108.0

//intaxPriceはコンピューテッドプロパティで値を持たない、算出する

//よってここでは、itemに100がセットされる

print(item.price)
//100になっている

item.price = 150
//今度はpriceに値150をセット

print(item.intaxPrice)
//162になっている

//intaxPriceには何も変更を加えていないのに、162になる

//これが値を保持せずに、値を算出するということ

参考サイト 【Swift】セッター(Setter)、ゲッター(Getter)の処理を書く - Qiita

これができたから何?となると思います。

それで、実際に利用したソースを示します。

画面を越えて、値を状態を保持したいときなどに、利用します。

プロトコルを宣言して、そのプロトコルにゲッター、セッターを定義しておけば、そのプロトコルを利用したクラスでは、このゲッターセッターが利用できます。 左画面から右画面へテーブルビューへ表示する、配列を渡したいとします。 別Viewになっていますので、そのままでは値を渡せません。 ここで登場するのが、先程のゲッターセッター、そしてプロトコルです。 f:id:happy_teeth_ago:20181118202846p:plain

まずプロトコルの宣言 どこに記載しても良いです。

protocol wordDelegate {
   
 var ofDics:[DatDic]?{get set}

}

ofDics という変数名で型は DatDic型の配列になっています。

そして{ }でゲッターセッターが宣言されています。 一つの値を変更すれば、もう片方に値がセットされると言うことです。

目的は左画面のtableViewに表示され、タッチしたところから下にあるものすべての配列を、右画面に渡します。

では、左画面のソースを見てみましょう。

 //デリゲートのインスタンス
    var ofWord: wordDelegate?

//テーブルをタッチしたときの処理
   func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        //配列の特定の行から最後までをdetailDicへ移動する

        ofWord?.ofDics = Array(datDics![indexPath.row..<datDics!.endIndex])

//ここでofWordを利用して、プロトコルのプロパティにアクセスしています。

//別の画面のプロパティになります。        

    }

では遷移先、右画面では、どのように記載するのでしょうか?

    var ofDics: [DatDic]?{

        set{//set newvalu=左でsetした値が入る

            datDics = newValue

            tableView.reloadData()

//左でセットした値が入る。それでtableをリロードする。

        }

        get{//setしたdatDicsを表示しているだけ

            return datDics

        }

    }

//メンバ変数 ゲッターで帰ってきた値が詰め込まれるため。   

    var datDics:[DatDic]?

あとはTableViewにdatDicsを表示するだけ。 左から右に値を渡せました。