はじめに
Staticに関して簡単にまとめてみた。また、Staticキーワードと同じような概念にClassキーワードというものがある。先に両者のキーワードの違いを下記にまとめる。
比較項目 | Static | Class |
---|---|---|
オーバーライド | NG | OK |
ストアドプロパティの定義 | OK | NG |
コンピューテッドプロパティの定義 | OK | OK |
Staticプロパティとは
- Static(スタティック)は静的であり、タイプ(型)とも呼ばれる。
→ スタティックプロパティ = タイププロパティみたいな感じ - インスタンスを作らなくてもアクセスできる。
→逆に言うと、インスタンス単位でアクセスすることができない。= 値の変更は可能だが、再度初期化することができない
→インスタンスを生成する必要がないため、メモリ消費を抑えることができる - static var は「静的変数」と呼ばれ、すべてのプログラムが終了するまで一貫してその値を保持し続ける。
ソースコード
1、Staticの動き方
Swift
class Noodle { //クラスはあくまで設計図なので、まだインスタンスを持っていない
var taste = "醤油" //普通のプロパティ
static var topping = "焼き豚" //スタティックプロパティ
}
//インスタンス化した場合は、taste(普通のプロパティ)にはアクセス可能
//しかし、toppingはstaticプロパティなため、インスタンス化してtoppingにはアクセスできない。
let n = Noodle()
n.taste //醤油
//Staticプロパティは、インスタンス化をしないでtoppingにアクセス
Noodle.topping //焼き豚 ←クラス単位ではアクセス可能
Noodle.topping = "焼き豚から値を変更する" //値の変更
Noodle.topping //焼き豚から値を変更する
2、静的(Static)と動的の動き方の比較
//まずは動的の検証
//動的変数は関数内で何度も初期化できるため、関数が終了するとその存在もメモリ上から消滅する
class Dynamic {
func dynamic() {
//動的変数を宣言し、値を0で初期化
var menma_count = 0
menma_count += 1
print("メンマは\(menma_count)本入っています。")
}
}
let d = Dynamic()
//関数を実行するたびにメンマの数が1本ずつ増えると思っていたが増えない。
//なぜなら、関数を実行するたびにmenma_count = 0で内部を初期化してしまうため。
d.dynamic() //メンマは1本入っています。
d.dynamic() //メンマは1本入っています。
d.dynamic() //メンマは1本入っています。
//上記を踏まえ、static(静的)変数とdynamic(動的)変数の両方をMixクラス内で作成し、挙動を比べてみる。
class Mix {
//static(静的)
static var sNum = 0
//dynamic(動的)
var dnum = 0
//実行するたびに数字を1カウントしていく関数
func sCount() {
//static変数はインスタンスを生成しないため、sNumの宣言にはClass名からアクセス
Mix.sNum += 1
print("Mix.sNumの値は:\(Mix.sNum)")
}
//こちらも実行するたびに数字を1カウントしていく関数
func dCount() {
dnum += 1
print("dNumの値は:\(dnum)")
}
}
//インスタンス化1回目
var result1 = Mix()
//各々関数にアクセス
result1.sCount() //Mix.sNumの値は:1
result1.dCount() //dNumの値は:1
//インスタンス化2回目
var result2 = Mix()
//各々関数にアクセス
result2.sCount() //Mix.sNumの値は:2
result2.dCount() //dNumの値は:1
//インスタンス化3回目
var result3 = Mix()
//各々関数にアクセス
result3.sCount() //Mix.sNumの値は:3
result3.dCount() //dNumの値は:1
//要は、static変数を有する関数(sCount)を何度インスタンス化しても値は0で初期化されず、前回の値を引き継いだまま増えていく。ということは、「インスタンス化」するときに初期化は1度しか行われず、値は変わったら変わりっぱなし。
//逆に動的変数は、動的変数を有する関数(dCount)をインスタンス化するたびに値は0で初期化され、0に初期化されたところからカウントする。(上記のdCount関数を例にあげています)
おわりに
定期的に復習しないとと分からんくなる。
参考記事
Swiftのstatic、classキーワードの違いについて
[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)
↑引用元
石川 洋資 (著), 西山 勇世 (著)
発行者:片岡 巌
出版社:技術評論社
印刷/製本:日経印刷株式会社
開発環境
- Xcode-13.4.1
- Swift version 5.7