読み進めていく本↓
前回⇒「【Swift奮闘記ep11】プロパティ後半(型プロパティ、プロパティの監視)」
プロパティを長々と2回に分けてしまったが、やっとの事でメソッドに入る。
ではさっそく。
メソッド
メソッドとは関数のこと。プロパティ同様、インタンスに持たせるメソッドと型に持たせるメソッドの2通りある。
インスタンスメソッド
プロパティと同じようにやればいいのでここは理解。
class Car {
var isOn = false
func on( ) {
isOn = true
print(“エンジンスタート!“)
}
func off( ) {
isOn = false
print(“エンジンストップ!“)
}
}
on( ),off( )でtrue,falseが切り替わるようになっている。
メソッドの呼び出しもプロパティと一緒で
var a = Car()
a.on()
a.isOn
a.off()
a.isOn
と書く。結果(リザルトバーとコンソール)は以下の通り。
Car
Car
true
Car
false
エンジンスタート!
エンジンストップ!
メソッド、なかなか面白いかも。
selfキーワード
クラス内のプロパティとメソッドの引数のカブり等を防ぐために、プロパティの頭に「self.」をつけることでプロパティを明示的に指定する。
つまり
class Car {
var fuel = 0
func add(fuel: Int) {
fuel += fuel
}
}
だとプロパティのfuelとメソッドの引数fuelが区別されずに、全て引数になってしまう。
それを防ぐために以下のようにする。
class Car {
var fuel = 0
func add(fuel: Int) {
self.fuel += fuel
}
}
self.をつけた。
さらに以下のように指示を出す
var a = Car()
a.fuel
a.add(fuel: 3)
a.fuel
a.add(fuel: 4)
a.fuel
その結果
Car
0
Car
3
Car
7
となる。
プロパティのfuelに引数で指定した数字がどんどん足されていっているのがわかる。
※追記
selfをつけることによって「各インスタンスの」という意味になるってことで俺は納得した。
例えば let sato = Car()でインスタンス化したらsato.fuelに代入することになるし、let kato = Car()でインスタンス化したらkato.fuelに代入することになる。みたいな感じ。
型メソッド
型プロパティ同様に型メソッドというものがある。
使うケースも同じで、どのインスタンスでも共有して使うメソッドは型メソッドとして定義すれば良い。(わかっている風に語っているが、表面的にしか理解していない。)
※追記
もし理解できなかったら、まずは型プロパティを理解しよう。
感覚的には型プロパティも型メソッドも同じ。
また注意点として、型メソッド内ではインスタンスプロパティは使えないことを押さえておこう。型プロパティしか使えない。
では実際にコードを見ていこう。
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 |
class Car { static var limit = 60 class func isOver(speed: Int) -> Bool { return speed > limit } var speed = 0 func change(speed: Int) { if(!Car.isOver(speed: speed)) { self.speed = speed } } } let car = Car() car.change(speed: 40) car.speed Car.limit = 100 car.change(speed: 80) car.speed |
うわあ〜〜全然わからん。
一つ一つに注目してみてみよう。
class Car {
static var limit = 60
// 型プロパティを定義。リミットを60kmに設定。
class func isOver(speed: Int) -> Bool {
// 型メソッド。戻り値をBool型に指定。
return speed > limit
// 引数speedが60を超していればtrueになる。
}
var speed = 0
// 現在の速度をプロパティで表現?意味わからん。
// ※追記 ⇒ちょっと前に出てきたspeedは引数のspeed。これはプロパティ。
func change(speed: Int) {
// changeというメソッド。引数がまたもspeed。
if(!Car.isOver(speed: speed)) {
// speed > limit でtrue なので、もしfalseなら〜ということ。
self.speed = speed
// もしlimitを越さないspeedであればself.speedにspeedが代入されてspeedが変更される。
}
}
}
let car = Car()
// インスタンス化
car.change(speed: 40)
// 40を引数として指定。
car.speed
// 無事にlimit 60 より小さいのでspeedは40に変更された。
car.change(speed: 80)
// では80はどうだろう。
car.speed
// speed > limit に当てはまってしまい(true)
// !Car.isOver(speed: speed)はfalseでself.speedに80が代入されない。
// よって40のまま
Car.limit = 100
// リミットを100に変える
car.change(speed: 80)
car.speed
// するとspeedが80に変更された。
以上、解説である。
なんとなくわかったが、自分でこれを一から作れと言われたら絶対無理だし、引数とかプロパティでspeedを使いまくる理由がわからない。
紛らわしすぎやろ、どれかspeedstarとかなんでもいいから区別してくれや。
ちなみに本の中ではspeed = newSpeed といった具合にself.を使わずにやる方法も書いてあるのだが、なんかイマイチちゃんとしたやり方のなのかが書いておらず、曖昧な感じで終了。
まとめ
まとめとかいいつつ全然まとめるつもりはないし、意味も半分くらいしかわからない状態のまま次に行っちゃうよ。
こういうのってとりあえずざっと勉強して先に進めば、
「あ、あそこで言ってたのってそういうことか!」ってなるんだよね。今までの経験から言って。
だから理解していなくても希望を捨てずに続けてみてくれ。
ちなみにどうしてもわからんポイントを書いておくと、なぜ型プロパティを使うのか。なぜ型メソッドを使うのかが今回全くわからなかったあああ〜。
※追記
1周して、今2周目だけど、なぜ型プロパティを使うのかはなんとなくわかった。型メソッドも。
117ページの説明と図を見れば大体の人は理解できそう。
コメント