J.log

jakeの日常

Swiftの勉強メモ4

続き。

 

Swiftの勉強メモ3 - J.log

 

今回は8.3 クラスから。

・構造体とクラスで何が違うのか?を理解しないといけないようだ。

・構造体は値渡し、クラスは参照渡し。パラメータが多いと後者のがオーバーヘッドが少なくなるのかな

・構造体だと渡した値はコピーされるので、書き換えられる心配がない。クラスは参照渡しなので書き換えられる可能性がある。また参照した時に値が書き換えられている可能性がある。

・クラスのメソッドではmutating(変異メソッド)を指定できない。インスタンスメソッドを使えば値の書き換えができるため指定する必要もない。

・単純なプログラムだと構造体とクラスでの違いはあまりない。

・クラスにもイニシャライザーがある。Javaでいうコンストラクタ

・名前は必ずinitでなければいけない。

・アクセス制御(参照や書き換えできる範囲の設定)がある。public、internal、private。真ん中がわかりにくいかもだけど、同一モジュール、同一フレームワーク内で利用できる。

・イニシャライザーの引数とクラス内部で使ってる変数は別物。名前を変えないと区別がつかずエラーになる。

インスタンスそのものを示すselfというキーワードを使うと、クラス内部の変数をself.nと表記できるので、イニシャライザーの引数と同じ名前にしても大丈夫。

・イニシャライザーに引数を設定した場合、クラス使用時に必ず引数を指定する必要がある。省略は不可能。

・ただし、convenience init()というのを用意してデフォルト値を与えるような実装にすることでクラス使用時に引数を省略してもOKになる。

 

8.4 プロパティ

・格納プロパティと計算プロパティがある。

・格納プロパティが、今までのいわゆるプロパティ、らしい。

インスタンスの中で変数に計算式を代入できるのが計算プロパティ。定数には指定できない。

・計算プロパティは計算式なので、式に使う変数などは計算式より後に定義してもOK。順序にうるさくないのは、コーディングしやすくていい。

・計算プロパティにゲッターとセッターを指定することができる。デフォルトはゲッターのみを指定した状態。セッターを用意すると、計算プロパティに数値を代入→プロパティが計算→計算結果をプロパティから取得ということができる。

・上記の記述の際にnewValueというキーワードを使うと、更に記述が減らせる。新しい入力値を計算プロパティで使ってる変数に代入するという意味になるようだ。

・……ただ、上記だと新しい値は1個しか指定できない気がする。複数の値をまとめて書き換えるなら格納プロパティとして用意した変数に書き込むほうがいいのかも。

・プロパティを書き換えようとした時に処理をさせる、ということができる。書き換え前ならwillset、書き換え後ならdidsetというキーワードを使う。

VBでテキストボックスのchangeイベントとかlostfocusイベントとかあったけど、あれをコード内でやるようなものだろうか?

・willsetなら新しい値のチェック、didsetなら代入後のチェックやパラメータを変更された際の計算式の再演算とかに使えるかな。

・willset/didsetを使うとき、代入直前の値をoldValue、代入直後の値をnewValueとして参照できる。

・型プロパティというのになる。

・定義した全てのインスタンスで共有するプロパティになる。計算式の共通で使う値(消費税率とか?)を入れるのに役立つんじゃないかな、たぶん。

・構造体や列挙型だとstatic、参照型だとclassになる。実例を見た後で実際に使ってみないと理解しきれないかも。

 

8.5 メソッド

メソッド=構造体などの中で定義された関数のこと

・staticやclassの「ついてない」ものはインスタンスメソッドと呼ばれる。

・型メソッドと対する言葉になるかな

・型メソッドでもstaticなどをつける。変数でも関数でもルールは同じということ。

・呼び出す場合も型.関数とする。 

・型プロパティ、型メソッドを構造体に分離し、クラス内で呼び出しを設定することもできる。

 

8.6 添字

・わざわざインスタンスメソッドにするほどでない小さい計算のときに使う。

・関数と同じでセッターも設定できる。

複数の引数を持った添字も作れる。

Javascriptの匿名関数みたいだなあ、そういえば。

 

今日はここまで。