Swiftでコードを書いていると、get
やset
というキーワードを見かけることがある。
私自身が「あっそういうことか」と理解するまで「難しそう、、、」と敬遠していたのだが、これはプロパティの「値の出し方」と「入れ方」をコントロールするためのしくみである。
この記事ではget(ゲッター)とset(セッター)がどういう意味なのかと使い方をわかりやすく解説する。
Contents
get(ゲッター)・set(セッター)とは?
Swiftではあるプロパティの値をどうやって「取り出すか」、あるいは「設定するか」を自分で決めることができる。
-
get(ゲッター):値を「取り出す」処理
-
set(セッター):値を「設定する」処理
この仕組みはコンピューテッドプロパティというプロパティの中でよく使われている。
「値をどうやって計算して出すか」
「値が変わったときにどう対応するか」といったルールを決めたい時にgetとsetが活躍する。
get(ゲッター)の使い方
例えば、四角形の面積を計算したいとき、「幅(width)」と「高さ(height)」を使って自動で面積(area)を出すプロパティを作れる。
1 2 3 4 5 6 7 8 9 10 |
struct Rectangle { var width: Double var height: Double var area: Double { get { return width * height } } } |
このように、プロパティの値を自動で計算して返す仕組みが「ゲッター(get)」である。
ちなみに、get
だけの場合は省略して書くこともできる。
1 2 3 |
var area: Double { return width * height } |
これはget
だけを使っている場合の省略形で、実際によく使われる書き方だ。
set(セッター)の意味と使い方
次に、値を「設定したとき」の動きをコントロールする「set(セッター)」を使った例を紹介する。
たとえば、円の半径(radius)と直径(diameter)のように、お互いに関係する値を使いたい場合は次のように書く。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
struct Circle { var radius: Double // 半径 var diameter: Double { // 直径 get { return radius * 2 } set { radius = newValue / 2 } } } //使用イメージ var circle = Circle(radius: 5.0) print(circle.diameter) // 10.0 circle.diameter = 20.0 print(circle.radius) // 10.0 に自動で更新されている! |
この例では、
-
get
で「直径 = 半径 × 2」を返す -
set
で「半径 = 新しい直径 ÷ 2」に更新する
という処理になっている。
diameter(直径)の値を取り出すと半径の二倍の値が返ってくるだけでなく、diameter(直径)に直接値を入れると自動で radius(半径)の値もその直径の値に応じて変更されるのだ。
このように、直径を新しく設定するとそれに応じて半径も自動で変わる。
このような「連動する値」を扱いたいときに、set
(セッター)はとても便利である。
私自身、get は値を直接取り出す時に実行され、set はそのプロパティに値を入れる(セットする時)時に実行される、ということを知って、ようやくgetとsetの違いを明確に理解することができた。
setの中のnewValueとは?
set
の中では、自動でnewValue
という名前の変数が使える。この中に、「新しく設定された値」が入っている。
1 2 3 |
set { radius = newValue / 2 } |
また、newValue
の代わりに、自分で名前をつけることもできる。
1 2 3 |
set(newDiameter) { radius = newDiameter / 2 } |
こうすれば、何の値を受け取っているのかがより明確になり、読みやすいコードになる。
get(ゲッター)・set(セッター)の活用シーン
get(ゲッター)・set(セッター)の活用シーンとしては下記が考えられる、
-
関連する値を自動で調整したい時
-
値の計算方法や制限ルールを組み込みたい時
-
中のデータを守りつつ、外から使いやすくしたい時
たとえば、「マイナスの値は受け付けない」といったルールをセッターに書くことで、データの正しさを保つこともできる。
まとめ
Swiftのget
とset
は、「プロパティの値の取り出し方(ゲッター)」「値の設定の仕方(セッター)」を自分で決めることができる便利な機能である。
特に、値を計算して使いたい時や値の変化に応じて何かしたい時に大活躍する。
コンピューテッドプロパティとあわせて、ぜひ使いこなしていこう。