この本を見ながら進めてる↓
前回⇒「【Swift奮闘記ep16】継承について(クラス・イニシャライズの継承、オーバーライド、superキーワード)」
継承については、解決しないわからないポイントが一個あったが大体オッケーだったが。
今回はストラクチャ。
ストラクチャの定義
ストラクチャとは、シンプルな「値」を表現するための型のこと。
クラスよりできることが狭められているが、クラスの劣化版というわけではなく、クラスとストラクチャは使い道が違うだけ。とのこと。
説明よりも実践、ということでコードを見て行こう。
クラスと形はほとんど同じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
struct Fuel { let max = 30 //最大容量 var used = 0 //どれだけ使ったか var remaining: Int { //余った量をリターンで返す。 return max - used } } var fuel = Fuel() fuel.used = 10 fuel.remaining |
さらにインスタンス化する方法やプロパティ・メソッドを使う方法などはクラスと同じ。
え、じゃあクラスと何が違うの。。。?
そんな疑問にぶち当たる。
ストラクチャでできること
- プロパティの定義
- メソッドの定義
- サブスクリプトの定義
- イニシャライザの定義
- エクステンションによる機能拡張
- プロトコルへの準拠
上記は全てストラクチャでできることで、クラスと使い方は同じである。
あと、ストラクチャは継承ができないこと、型プロパティを定義するときは「クラス→class」で「ストラクチャ→static」であることを覚えておこう。
※追記
クラスとストラクチャの違い
ストラクチャはクラスの劣化版というわけではなくて、それぞれ使い道が違う。
クラスは「機能や仕組みのまとまり」を表現するのに適していて、ストラクチャは「値」を表現するのに適している。
格闘ゲームで例えると、「Aボタンを押すとパンチが出る」「Bボタンで必殺技」っていう機能を設定するのがクラスで、「体力が100あって、そこから攻撃を受けると20ずつ減っていく」みたいな値に関してはストラクチャ。
参照型と値型の違い
クラスとストラクチャの大きな違い・・・らしい。
説明を読むとよくわかった。違い、納得!
まずはクラスのコード。
1 2 3 4 5 6 7 8 9 |
class Car { var type = "Unknow" } let carA = Car() let carB = carA carB.type = "Wagon" carA.type //carAのtypeプロパティの中身も変わっていることが確認できる。 |
carBの値を変えるとcarAの値も一緒に変わってしまう。
それに対してストラクチャのコード。
1 2 3 4 5 6 7 8 9 10 11 |
struct Fuel { var used = 0 } var fuelA = Fuel() var fuelB = fuelA fuelB.used = 3 fuelB.used //fuelBの値を変えても fuelA.used //fuelAの値は変わらない。 |
fuelAの値をfuelBに代入するとき、fuelAの中身を「複製」してfuelBに入れる。この感覚はスッときた。覚えておこう。
あと、値型にはインスタンスを定数に代入した場合、プロパティを変更できなくなる。
理由は謎だけど、ストラクチャは定数にインスタンスを代入したらプロパティは変更不可。覚えとこ。
プロパティとイニシャライザ
クラスとではプロパティを定義する際に値が入っていないとエラーになる。
ストラクチャはエラーにならない。
同様にクラスではイニシャライザを持つ場合、引数を定義しておかなければいけないが、ストラクチャの場合、定義しなくてもいい。
その代わりストラクチャはインスタンス化する際に引数を指定することとなる。
1 2 3 4 5 6 7 8 |
struct Fuel { var max: Int var current: Int } var fuel = Fuel(max: 30, current: 25) fuel.max fuel.current |
てことでどんな初期値を入れるかはインスタンス化するときにインスタンス化する人に任せる的な。
最後に
ストラクチャは結構あっという間に終わってしまった。
大体の部分は理解できた気がする。
クラスの利点、ストラクチャの利点を理解して長所を生かすような使い方をしていけばいいんだね!(そのうち使いこなせるようになるのかな〜?)
次回は列挙型。列挙型も値型だよ!
コメント