目次
1. ローカルスコープとグローバルスコープ
次のように変数を定義する場所でスコープが決まります。
1 2 3 4 5 6 7 8 9 10 |
var globalVal = "a" // グローバル変数 func printFunc(){ var localVal = "b" // ローカル変数 print(localVal) } if 0 < a { var localVal = "c" // ローカル変数 } |
2. ローカルスコープ
関数(func)や制御構文( ifなど )の内部で定義した変数はローカルスコープになります。
定義した関数や制御構文からのみアクセスできます。
ざっくり表現すると括弧 { } 内で定義した変数はローカルスコープの変数になります。
1 2 3 4 5 6 7 |
func printFunc(){ var localVal = "b" // ローカル変数 } if 0 < a { var localVal = "c" // ローカル変数 } |
3. グローバルスコープ
ローカルスコープ以外で定義した変数はグローバルスコープになります。
どこからでもアクセス可能な変数になります。
1 2 3 4 5 6 7 8 9 10 11 |
var globalVal = "a" // グローバル変数 func changeVal() { globalVal = "b" // グローバル変数に関数内からアクセス } print(globalVal) // a changeVal() print(globalVal) // b |
changeVal関数内で、グローバル変数(globalVal)の値を変更するため、最後のprintでは変数globalValの値が b になります。
4. 同じ名前の変数がある場合、どちらの値が使用されるか?
同じスコープ内で同名の変数を定義するとエラーになりますが、スコープが異なると同名変数を定義することができます。
1 2 3 4 5 |
var name = "global" // グローバル変数 func printName(){ var name = "local" // ローカル変数 } |
変数nameの値を出力すると、それぞれのスコープで宣言した変数に優先してアクセスします。
1 2 3 4 5 6 7 8 9 10 |
var name = "global" // グローバル変数 func printName(){ var name = "local" // ローカル変数 print(name) // local } printName() print(name) // global |
5. スコープの使い分け
基本的に特別な事情がない限りは、ローカルスコープで宣言・使用することをお勧めします。
グローバルスコープの変数は、どこからでもアクセスできて便利ですがプログラムを保守するうえで、変数の影響範囲が大きくなり、バグの温床になることもあるので多用はお勧めできません。
使用する場合は、変数の意味をきちんとコメントとして残しておく必要があると思います。