この本を見ながら進めてる↓
前回⇒「【Swift奮闘記ep19】プロトコル前半(プロトコルの定義と準拠、プロパティ・メソッドの定義)」
はい、今回もプロトコルについて。
プロトコルとは「約束事」を取り付けて、クラスやストラクチャを作成できるものだったね。
それではみていこう。
プロトコルの型としての使用
型指定にプロトコルが使われた場合、その変数や定数は「プロトコルに準拠した何かしらの型のインスタンス」として扱うことができます。
とのことだがこれまたさっぱり意味がわからないので、実際にコードを見て理解することとする。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
protocol Door { var numberOfDoors: Int { get } } class Minivan: Door { var numberOfDoors = 4 } //変数numberOfDoorを定義したプロトコルに準拠したクラスを定義した。 var car: Door = Minivan() //Doorプロトコルを指定した変数にMinivanクラスのインスタンスを代入 car.numberOfDoors class Sportscar: Door { var numberOfDoors = 2 } //Doorプロトコルに準拠したクラスをもう一個定義した。 car = Sportscar() car.numberOfDoors |
むずいな。
「変数や定数に異なる型のインスタンスは代入できない」というルールはありますが、型注釈がDoorプロトコルとなっているため、carにはDoorプロトコルに準拠した型のインスタンスであれば代入できる。
これが理解のポイントになりそうだが・・・基本的によくわからんかった。
あまり考え過ぎてもドツボにハマるから軽く流して次に行こう。
※追記
意外と単純な話で、例えばvar a: String = “hello”というふうに変数aに helloを代入したとしよう。
そうすると変数aはString型なので、仮に a = 20と代入しようとしたらエラーとなるだろう。
でもa = “hi”とString型を代入することはできる。
これと同じことがプロトコルでもできるという話だ。
プロコトルを型として扱えて、同じ型(プロトコル)のインスタンスであれば代入できる、ということ。
デリゲートの活用
デリゲートには委譲という意味があって、「この部分の処理は実装するときにお任せする」といったように・・・とあるが全くわからない。一体何のことを言っているのか。
また具体的にコードを見て理解してみようと思うが、そこで理解しても結局このコードはどんな時に使うのか?というのがちゃんとわからないので、あまり理解しても意味がないんだよな〜。
いやでも基本をひたすら頭に詰め込むというのが俺の方針なのでこのまま突き進んで行こう・・・。
ではデリゲートについてコードを見て行こう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
class Car { var gear = 1 var maxGear = 6 func upGear() { if(gear < maxGear) { gear += 1 } } } var a = Car() for _ in 1...7 { a.upGear() } a.gear |
おっけーここまではわかるぞ。
だって普通にクラスを定義してインスタンス化しただけだからね。
これの発展系がデリゲートなのか?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
protocol GearDelegate { func up(gear: Int) -> Int } //まずはプロトコルを定義した。 class Car { var gear = 1 var delegate: GearDelegate init(delegate: GearDelegate) { self.delegate = delegate } func upGear() { gear = delegate.up(gear: gear) } } //正直さっぱりわからない。イニシャライザを使っているのはわかるのだが... class Transmission: GearDelegate { let maxGear = 5 func up(gear: Int) -> Int { if (gear < maxGear) { return gear + 1 } return gear } } //プロトコルに準拠させたTransmissionというクラスを定義した let transmission = Transmission() let car = Car(delegate: transmission) for _ in 0...9 { car.upGear() } car.gear |
もはやさっぱりわからん。最後のtransmission()のインスタンス化した後の変数carはなにやっとるん?
イニシャライザで初期値を設定してるんだろうけど、transmissionが引数になっているけど、どういうこと?
ギブアップでござる。
要復習だから絶対いつかここに戻ってこよう。
今日はここまで
※追記
2周目でも頭こんがらがるくらいだから相当難しいと思う。
でもなんとなくはわかるようになってきた。
ポイントだけ書いておくと、変数delegateはGearDelegateプロトコルに準拠しているので、GearDelegateプロトコルに準拠したインスタンスであればどんな型でも代入OKということ。
インスタンス化した時にdelegateプロパティの中身を決める必要があるので、イニシャライザの引数にしていること。
Carクラスではギアについては定めず、Trasmisshonクラスに任せますよ、ってのがでギアについて定めた。これがデリゲートの委譲という性質のことを言うのだと思う。
iOSアプリを作って思ったんだが、デリゲートって結構出てくる。
ここでちゃんと理解するのがベストだけど、ちょっと材料が少なすぎる。逆に言えばiOSアプリで出てくるのであれば、アプリ制作しながら楽しくデリゲートについて学んだ方が楽しく理解できるんじゃないだろうか?
ってことで今の段階ではデリゲートについてはなんとなく理解するだけでいいって話。
コメント