この本を見ながら進めてる↓
前回⇒「【Swift奮闘記ep20】プロトコル後半(プロトコルの型としての使用、デリゲートの使用)」
プロトコルを華麗に受け流して、エクステンションに移る。
エクステンションとは
エクステンション・・・既存の型(またはプロトコル)を、元のソースコードを修正することなく拡張できる機能
「元のソースコードを修正することなく」っていうのがミソだと思うね。
これだけでもうどんな機能なのか想像できちゃうから後は実際にエクステンションをどう定義するか見ればオッケー。
髪を付け足す「エクステ」と同じという解説がウケた。確かに。
エクステンションが既存の型に拡張させる機能一覧は以下。
- プロパティ(計算型プロパティ)
- メソッド
- イニシャライザ
- サブスクリプト
- プロトコルの準拠
エクステンションの定義
実際にエクステンションを定義してクラスの機能を拡張してみよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
class Car { var brand = "" var name = "" var year = "" } //Carクラスを定義する extension Car { var description: String { return "ブランド:\(brand) 単車:\(name) 年式:\(year)" } } //Carクラスに機能を追加する。 //descriptionという計算型プロパティを定義する。 let car = Car() car.brand = "honda" car.name = "vezel" car.year = "2016" car.description //Carクラスのインスタンスでdescriptionを普通に使える。 |
よくわかった!エクステンション!
ありがとう!エクステンション!
俺の人生のエクステンションできれば・・・。
準拠するプロトコルの追加
後からプロトコルの準拠をさせることができる。
実際にやってみよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class Car { var mileage = 0 var usedFuel = 0 } protocol FuelEfficiency { var fuelEfficiency: Int { get } } extension Car: FuelEfficiency { var fuelEfficiency: Int { return mileage / usedFuel } } //エクステンションを使ったプロトコルへの準拠 let car = Car() car.mileage = 200 car.usedFuel = 10 //Carクラスをインスタンス化 let efficiency: FuelEfficiency = car efficiency.fuelEfficiency |
まあ細かいところは飛ばしていいんだけども、とりあえず先にクラスを定義しちゃったとしても、後からプロトコルへ準拠させることができるってことを覚えておこう。
※追記
最後のlet efficiency: FuelEfficiency = car がわかりづらいかなと思うんだけど
単純にcar.fuelEfficiencyと記述すればメソッドfuelEfficiencyを使えるよね。
多分これは
「”FuelEfficiency”型に指定した”extension”に同じFuelEfficiency型のcarを代入できる」
ということを強調したいためだ。
第4章Swiftとオブジェクト指向プログラミングの終了
やっと第4章が終わった。長かった。
理解度は60%といったところかな。復習しないと忘れそうだけど、引き続き先に進んじゃおうと思う。
ただ、次の章も文法の勉強。心が折れそうだよ〜。
コメント