Open3

[Swift] タイプメソッド, static

🍤🍤

staticとは

  • 要するにインスタンス化しないで使うメソッド
  • staticで宣言した変数は呼び出したり変更することができる。
  • 本来class内で宣言した変数は、呼び出したり、その値を変更することについて想定されていない。
  • しかし、staticで宣言した変数は呼び出したり変更することができる。
    => インスタンスを作成しなくてもアクセスすることができるということ。
  • 逆に、インスタンスを作成し変数を呼び出すとエラーが発生する。
    =>再度初期化することができない。
class noodle {

var taste = "醤油"
static var topping = "焼豚"
}

print(noodle.taste)
// error
print(noodle().taste)
//醤油 あまり望ましくない呼び出し方
print(noodle.topping)
//焼豚 インスタンスを作らなくてもアクセスできる

//インスタンスを生成
ar miso = noodle()

//普通の変数を呼び出す
print(miso.taste)
//醤油

//static変数を呼び出す
print(miso.topping)
//error 再度初期化することができない

🍤🍤
  • static var は「静的変数」と呼ばれるもので、全てのプログラムが終了するまで一貫してその値を保持し続ける変数。
  • 対立概念である「動的変数」は関数内で何度でも初期化することができ、関数が終了するとその存在もメモリ上から消滅する。
動的変数
     func dinamic() {


     //動的変数を宣言・初期化
     var menma_count = 0
     menma_count += 1
     print("メンマは\(menma_count)本入っています。")
     }

dinamic()
//メンマは1本入っています。
dinamic()
// メンマは1本入っています。
dinamic()
//メンマは1本入っています。

//関数を実行するたびに「menma_count」は内部で初期化されてしまうので、メンマはずっと一本
動的変数と静的変数共に有するコード
//クラスは、オブジェクトの設計図のようなもの。
class noodle {
   var taste = "醤油"
// 本日のオーダー数
   static var order = 0
// お客が替え玉した時の皿の数
   var sara = 0
//売上をカウントしていく
func uriage() {
noodle.order += 1
print("本日\(noodle.order)杯目の注文が入りました。")
}
//お客ごとの替え玉数をカウント
func kaedama() {
sara += 1
print("替え玉を\(sara)回したので皿は\(sara)枚です。")
} 
}

var kyaku_1 = noodle()
kyaku_1.uriage()
//本日1杯目の注文が入りました。
kyaku_1.kaedama()
// 替え玉を1回したので皿は1枚です。

//インスタンスであるお客が何人入店しても、オーダー数「order」はstaticにしてあるため、初期化されずに前回の値を引き継いだまま増えていく。
//static変数の、**値を保持し続ける(静的)**は、let(定数)のように「変わらない」という意味ではなく、「初期化は1度しか行われない」= 変わった状態のまま更新されていく ということ
  • インスタンスに依存しない公共的な用途やシングルトンパターン(シングルトンとは、オブジェクト指向プログラミングにおけるクラスのデザインパターンの一つで、実行時にそのクラスのインスタンスが必ず単一になるよう設計すること)で利用する。
  • classという常に存在していて1つしかないもの(出来たり消えたりしないので静的な存在)の変数やメソッドをシステム全体で使えるようにしたもの。
  • 初期化は1度しか行われず、プログラム内で一貫して値を保持し続けるので、複数のインスタンス間でその値を共有できる。
🍤🍤

staticの偉いところ。

  • そのコードを読む人にインスタンスの状態依存の処理でないことを明示的に示すことができる。
  • また、staticな処理に誤って動的なパラメータを記述するミスを防ぐことにも寄与する。
  • 全てのインスタンスで共通の変数にはstaticをつけないと、インスタンスが生成される都度メモリに書き出されてしまう。
  • staticメソッドは実行前にメモリや値が確保できているか検証している。
  • そのため、実行前にバグがないかある程度検証できる。(静的解析)
  • インスタンスをいちいち生成しなくても呼び出すことができるので、無駄なメモリ消費もなくて便利。
  • グローバル変数でええやん感はある。