Swiftの変数と定数に関して、わかりやすく徹底解説していきたいと思います。
変数・定数とは
変数と定数というのは、プログラム内でデータを保持するためのものです。イメージ的には入れ物です。
その入れ物は2種類あって、自由に出し入れできる「変数(variable)」という入れ物と、一度入れたら変更できない「定数(constant)」という入れ物があります。
変数と定数の宣言
宣言というのは、初めて入れ物を作る(定義)ことをいいます。変数はvar
、定数はlet
で定義します。
変数の宣言
以下は変数の宣言です。var
から始めて、変数名
、:
、型名
と記述します。
var 変数名: 型名
以下の例では、一行目は、age
という変数名で、Int型(整数)で宣言しています。二行目は、nameという変数名で、String型(文字列)で宣言しています。これらは、初期値を代入していないため、空の入れ物を定義しています。
var age: Int var name: String
以下の例では、上記の例に初期値を代入している宣言の仕方です。一行目は、25
という整数が入ったInt型(整数)のage
という入れ物を定義しています。二行目は、太郎
という文字列が入ったString型(文字列)のname
という入れ物を定義しています。基本的には初期値を入れた方が扱いやすいので、初期値入れるようにしましょう。
var age: Int = 25 var name: String = "太郎"
初期値がある場合、型名は省略できます。Swiftは、型推論(type inference)という仕組みがあり、最初に代入したものから型を自動的に決めることができます。一行目は整数の25
を代入しているため、整数のInt型になります。二行目は文字列の"太郎"
を代入しているため、文字列のString型になります。ちなみに、: Int
や、: String
のことを、型アノテーション(type annotation)と呼びます。
var age = 25 var name = "太郎"
一般的な書き方ではありませんが、,
を使うと、複数の変数を定義することができます。以下の例では、Double型(小数)のheight
とweight
を宣言しています。height
は、weight
の型アノテーションにより、Double型になります。
var height, weight: Double
また、一行で異なる型の宣言も可能です。初期値を代入するか、型アノテーションをつけます。
var age = 25, height, weight: Double, name = "太郎", birthY, birthM, birthD: Int
定数の宣言
以下のは定数の宣言です。let
から始めて、変数名
、:
、型名
と記述します。
let 変数名: 型名
最初がlet
かvar
なだけであって、上記で解説したvar
の宣言の仕方と変わりはありません。
let age: Int let name: String
変数と定数の宣言エラー
letと変数名(定数名)の間にスペースがない場合、エラーになります。変数名
と:
、型名
の間のスペースについてはエラーになりません。しかし、基本的には、変数名:
+
+ 型名
としましょう。
letage: Int // スペースがないためエラー let age : Int // OK let age: Int // OK let age :Int // OK
以下のように、変数名にスペースを入れるとエラーになってしまいます。以下の場合myAge
というふうにしましょう。
let my age: Int
変数と定数の命名規則
変数や定数名には、スペース以外なら、日本語でも絵文字でもつけることができます。しかし、基本的には、英数文字で記述するようにしましょう。そして、小文字から始めましょう。そしてさらに、複数の単語がある場合は、次の単語の頭文字を大文字にしましょう。これは、ローワーキャメルケースといいます。例えば、クリティカルヒットした数を数える値を宣言する場合は、criticalHitCount
というふうにしましょう。ちなみに、スペース以外ならといいましたが、1criticalHitCount
というふうに数字から始めるのもNGです。
var criticalHitCount = 0
値の代入
次は、値の代入方法について解説していきたいと思います。変数や定数に値を代入するには、=
を使います。=
は、同じというイメージが強いですが、プログラミングでいう=
は代入を表します。
代入の仕方
以下の例では、age
というInt型の変数を宣言し、その後でage
に20
を代入しています。そのため以下の2行を実行すると、age
には20が入っている状態になります。
var age: Int age = 20
変数の場合は何度も代入(上書き)が可能です。プログラムは基本的に上から順番に実行されるので、以下のコードは、最終的にage
が23
になります。
var age: Int age = 20 age = 21 age = 22 age = 23
式の代入も可能です。1+3
を代入しているため、a
は、4
になります。
var a: Int a = 1 + 3
定数や変数を、定数や変数に代入することも可能です。1
が入ったa
をb
に入れています。よって、b
は1
になります。では、b
に代入した後、a
はどうなるのかというと、a
は空にはなりません。変数、定数を代入するのは、渡すというよりかは、ハンコみたいなイメージです。
var a = 1 var b = a // 1
代入エラー
以下のコードを見てください。ageに代入している上の二つの行は、エラーになります。=
の左右にはスペースを入れるようにしてください。入れないのであれば、両方入れないようにしてください。理由としては、age= 1
というふうに書くと、age
の後置演算子だと認識してしまうからです。逆にage =1
というふうに書くと、1の前置演算子と認識してしまいます。算数で例えると、3 - 1
だと、2
と割り出せますが、3 -1
だとどうでしょう?ただ3
と-1
と書いてるだけです。-
と1
の間にスペースがないため、-
は1
のものになってしまいます。プログラムの=
もこれと全く同じです。
var age: Int age= 1 // コンパイルエラー age =1 // コンパイルエラー age=1 // OK age = 1 // OK age = 1 // OK age = 1 //OK
後ほど詳しく解説しますが、プログラミングには型というものが存在します。要は値の種類です。変数や定数に値を代入するには、その変数や定数と同じ型でないといけません。以下のコードは、age
という変数に、文字列の"20"
を代入しています。そのためエラーになります。これはSwiftの文法エラーで、コンパイルエラーと言います。
var age: Int age = "20" // エラー
以下のケースもエラーになります。name
はString型のため、Int型の10
を代入することはできません。もし10
が、"10"
のように、ダブルクォーテーションで囲われていたらエラーになりません。
var name: String name = 10
以下のケースもエラーになります。理由としては、a
の初期化が行われていないためです。a
に何らかの値が代入された後であればvar b = a + 1
はエラーになりません。
var a: Int var b = a + 1
変数と定数の違い
ここまで変数と定数を解説してきました。では、次に変数と定数の違いを解説していきましょう。冒頭でも言いましたが、変数は変更できる入れ物で、定数は一度入れたら変更できない入れ物です。
var
で宣言された変数は、何度書き換えてもエラーになりません。
var a: Int a = 1 a = 2 a = 3
しかし、letで宣言された変数は、一回のみ代入可能で、2回目の代入はエラーになってしまいます。
let b: Int b = 1 b = 2 // エラー let a: Int = 1 a = 2 // エラー
変数と定数の使い分け
全て変数で良いのでは?と思った方がいると思います。プログラミング始めたては私もそう思いました。全て変数でも、プログラムはかけます。しかし、危険なプログラムになってしまいます。理由としては、例えば、変えるとエラーになる値があるとしましょう。その値をvar
の変数で宣言してしまっていると、意図せず変更してしまったり、自分以外の人が変更してしまったりします。そのため、こういう値はlet
で宣言すべきです。プログラマーはvar
で宣言していれば変更していい値、let
で宣言していれば変更しない値と認識します。
また、Xcodeの機能として、一度も変更していない値の場合、let
で宣言すべきでは?という警告が表示されます。
逆にlet
で宣言された定数を変更しようとすると、エラーになりますが、以下のように、let
をvar
に修正しますか?という提案をしてくれます。Fixを押すとlet
がvar
に変更されます。