変数のスコープ
変数は、宣言した場所によって「使用できる範囲」が決まっています。
この「使用できる範囲」のことを「スコープ」といいます。
変数は、宣言さえすればどこでも使えるというわけではありません。
変数のスコープを無視しては、まともにプログラムを書けないといっても過言ではありません。
目次
1. 変数のスコープ
「変数のスコープ」を理解するために「ブロック」を使用します。
// ブロック内で変数宣言と参照を行う
{
let x="おはよう"
print(x)
}
上のプログラムを実行すると、結果は「おはよう」ですよね。
では、下のプログラムはどうでしょう?実行してみてください。
// ブロック内で変数宣言
{
let x="おはよう"
}
// ブロック外で変数参照
print(x)
結果は、「エラー」になります。
なぜ「エラー」になったかというと、変数「x」が使用できないところで「x」を使用してしまったからなんです。
下のようにprint(x)をブロック内に移動すると問題なく変数を使用できます。
// ブロック内で変数を参照するようにした
{
let x="おはよう"
print(x)
}
結果は、「おはよう」です。
今度は、変数「x」が使用できるところで「x」を使っているので問題ありませんでした。
要するに、変数は、その宣言された場所と同じ位置か、それより内側のブロックでのみ使用できるということです。
別の言い方をすれば、変数には「寿命」があるということです。
変数は、「宣言された位置(ブロック)で生まれて」、その「ブロックから外れた」ときに、変数は、その一生を終えて「消えてなくなってしまう」のです。
ブロックがどんなに入れ子(ネスト)になろうが、その変数が宣言された位置と同じか、内側のブロックであれば、その変数を使用することができます。
// 変数宣言はブロックの外
let x="おはよう"
{
{
// 変数宣言された位置より内側のブロックなら参照できる
print(x)
}
}
結果は、「おはよう」になります。
プログラムを書いていて、宣言したはずの変数が使えないというときは、「変数のスコープ」を疑ってプログラムを見直してみましょう。
2. 試してみよう
次のプログラム中で宣言された変数は、参照されたときにエラーになりますか?
問1
// ブロック無し
let x="おはよう"
print(x)
問2
// 宣言はブロックの外
let x="おはよう"
{
// 参照はブロックの中
print(x)
}
問3
// 宣言も参照も同一ブロック
{
let x="おはよう"
print(x)
}
問4
// 宣言はブロックの中
{
let x="おはよう"
}
// 参照はブロックの外
print(x)
問5
// 入れ子のブロック
{
let x="おはよう"
{
print(x)
}
print(x);
}
2-1. 答え
問4は、変数が宣言された位置より外側で参照されているので「エラー」になります。
3. まとめ
ブロックを使い変数のスコープを体験しました。
変数のスコープとは、その変数を参照して使える範囲のことです。
変数は、その宣言された場所と同じ位置か、それより内側のブロックでのみ使用できます。
次は、「条件分岐(じょうけんぶんき)」についてです。