Swiftの変数(Variables)と定数(Constants)

定数と変数

ここでは、プログラミングにおいて最も基本となる変数と定数について説明します。この後詳しく説明しますが、Swiftでは変数宣言にはvar、定数宣言にはletを使用します。

このページでは、そもそも変数や定数とは何か?Swiftではどのように宣言や初期化をするのか?変数や定数の名前のつけ方、どうやって出力するのか?に関して説明します。

変数・定数ってなに?

先ずは変数(variable)です。変数とは、言葉で定義すると、

値(value)を格納し名前をつけた箱

のようなものです。一方で、定数(constant)とは、

ある特定の値に固定された変数

のことです。定数はプログラミング上一度決めたら(初期化したら)、後で変更することができません。一方で変数は後で変更することができます。これは漢字の使い方”一定”、”変化”などから直感的にわかりますよね。

基本的に、プログラミングでは変数や定数に固有の名前をつけ、そこに値(数字や文字列)を格納します。

例) あるプログラミング言語で3個のオレンジとリンゴを変数として用意したい場合(ここでは型については無視しています)、

numberOfOranges = 3
numberOfApples = 3

のように定義できるとします。

ここで値として3という数字は同じですが、変数としての意味はリンゴとオレンジで違います。このように、変数として固有の名前をつけておくと、例えば後々リンゴの数を参照したい場合便利ですよね。

もちろん、適当な果物の個数を表現するのに数字をそのまま用いても良いですが、可読性が悪いですし、1年後に見なおした時に「この3ってなんだっけ?」ということにもなりかねません。

Swiftで変数・定数をどうやって宣言する?

プログラミング言語を用いる場合、一般的には、変数や定数はあらかじめ宣言(declaration)しておかなければ使えません。Swiftでは変数と定数をどのように宣言するのでしょうか?

2通りの方法があるので、順番に紹介します。1つ目は、宣言と同時に初期化する方法、2つ目は型を指定して宣言する方法、です。

宣言と初期化

Swiftにおける変数と定数の宣言の仕方は、基本的には次のような形になります。

// 変数・定数の宣言、初期化
var variableName = value // 変数
let constantName = value // 定数

変数(定数)を宣言する際には、var (let)を使って名前constantName (variableName)を指定します。宣言と同時に値を指定することを初期化と呼び、上記のように値を = valueで代入します。

算数や数学では=は等号で、これで結ばれた左辺と右辺は等しいという等式になります。一般的にプログラミングでは=は「代入」演算になり、「等号」には==を使います。

具体的な例を使って説明します。

// 1日を24時間単位として現在の時間を表示するようなプログラムを組みたい場合
let maximumNumberOfHour = 24
var currentHour = 1

と宣言してみました。簡単のため分や秒は無視します。

最初に少し触れましたが、Swiftではvarが変数を、letが定数を表します。したがって、上記のコードは

maximumNumberOfHourという定数を宣言し、24という値で初期化した。次に、currentHourという変数を宣言し1という値で初期化した

と読めます。この例では、1日を24時間単位としてますので、最大値として取り得る値は24で、この値は変化しません。したがって、maximumNumberOfHourを定数として宣言しました。また、現在の時間currentHourは刻一刻と変わりますので、変数として宣言しなければいけません。

型を用いた宣言(type annotation)

型(type)というのは変数や定数に格納する値の種類を指定するものです。Swiftには様々な基本的な型がありますが、それは別のページで紹介します。

先ほどの例を流用すると、

// 型宣言
let clockName: String
let maximumNumberOfHour: Int
var currentHour: Int
// 代入
clockName = "My clock !"
maximumNumberOfHour = 24
currentHour = 1

と書けます。この方法では、変数や定数を宣言する際にどのような型を保存するかを先に指定します。書き方は上記の例のように、コロン:を変数や定数の直後に置き、スペースを一つ空けて型を指定します。ここでの宣言は、日本語にすると

clockNameという定数を文字列型(String)で宣言し、その後"My clock !"という文字列(値)を代入した

と読めます。

上記の例では、宣言した後に代入しましたが、型を指定しつつ初期化することもできます。

// 型宣言と初期化
let clockName: String = "My clock!"
let maximumNumberOfHour: Int = 24
var currentHour: Int = 1

補足ですが、複数の変数または定数を宣言する場合

var currentHour = 1, currentMinute = 0, currentSecond = 10
var currentHour, currentMinute, currentSecond: Int

のようにコンマ,で分けて一行で宣言することも可能です。

変数・定数の名前に関して

Swiftでは、変数や定数の名前の付け方にどんなルールがあるのでしょうか?Swiftのプログラミングマニュアルから抜粋してみますと、

  • Unicodeを含む、ほぼどんな文字でも大丈夫
  • 空白文字(whitespace)はだめ。また、数学の記号、矢印、無効なUnicodeコードポイント、線やボックスを描く文字などもだめ。
  • 数字から始まる名前はだめ。ただし、名前の途中に入る数字なら大丈夫

という決まりがあります。

また、Swiftが事前に用意している変数・定数名はなるべく使わない方がいいです。どうしてもその名前でないと困るという場合は、名前をバックスラッシュ`で囲めば使えます。

しかし、その方法は推奨されていないようですので、可能な限り避けた方が良さそうですね。

変数・定数を表示(出力)する

変数や定数に保存されている値を出力するためには、Swiftで用意されているprint()という関数(function)を使います。

例えば、先ほど用意したclockNameを出力したい場合、

print(clockName)
// "My clock !"と表示

と書きます。実際にXcode上で確認してみましょう。

print()関数はデフォルトで改行を表す特殊文字列\nを挿入しますが、それを避けたい場合には、terminator:というパラメータに空白文字を指定します。

print(clockName, terminator:"")
// "My clock !"と表示(改行なし)

この記述は、関数のパラメータを理解しないと難しいと思いますが、「こういう書き方をする」というぐらいで暗記しておいても構わないと思います。

また、文字列の中に変数や定数を含めたい場合は

print("わたしの時計は\(clockName)という名前です。")
// "わたしの時計はMy clock !という名前です。"と表示

のように、変数・定数を\()で囲みましょう。

コメントの書き方

これまで何気なく使っていましたが、プログラム中にコメントを挿入することができます。コメント文はコンパイル時に無視されます。

// 1行のコメントはスラッシュ2つ

1行で収まるコメントを挿入したい場合は、スラッシュ/を2つ並べます。今はスラッシュと文字列の間にスペースが入っていますが、見やすくするために入れたものですから、スペースは必須ではありません。

また、複数行にまたがるコメントを挿入したい場合は、スラッシュとアスタリスク(米印)を組み合わせた構文/* ... */を使います

/* これもコメント
複数行にまたがってコメントを挿入できる
*/
/* 1行でも良い */

この形式の場合、複数行にまたがらず1行で収めても別に問題ありません

さらに、複数行のコメントの場合、コメントの入れ子が可能です。例えば、

/* コメントの入れ子
/* こんな感じで、コメントの中にコメントを入れることが可能 */
ソースコードを大きくコメントアウトしたい場合は、この機能が大変便利です
*/

という感じです。コードの中に書きましたが、この機能はソースコードを一度にまとめてコメントアウトする場合に非常に便利です。

上のソースだと、一番下のコメントがコメントじゃない感じで表示されていますが、これはサイト上で使っているsyntax highlightの仕様です。実際Xcodeのplayground等でテストしてもらうと分かりますが、コメントの入れ子はうまく行きます。

セミコロンは必要か?

結論から言うと、セミコロンは必須ではありません。しかし、他の言語(C言語とか)と同様に、書いても問題ありません。しかしながら、セミコロンが必須なケースがあって、それは独立した「(命令)文」(statements)を1行に書きたい場合です。例えば、

var hello = "こんにちわ"
print(hello)

というコードを1行にしたい場合は、セミコロンを入れないとコンパイルエラーになります。

var hello = "こんにちわ"; print(hello)

参考までに、その場合に出るコンパイルエラーは

error: consecutive statements on a line must be separated by ';'

という感じです。セミコロンは完全に好みですから、必要なら入れても構わないと思います。

まとめ

  • 定数は一度初期化したら後で変更できない
  • 変数は後で変更可能
  • 変数宣言にはvar、定数宣言にはletを使う
  • (1)宣言と同時に初期化、(2)型宣言のどちらかで宣言できる
  • 名前には使ってはいけない文字、文字列があるので注意
  • 出力するにはprint()関数。文字列の中に変数(または定数)を入れたい場合は\()で囲む
  • コメントは//、または/* */
  • コメントの入れ子が出来るので、一度にまとめてコメントアウトするのには便利
  • セミコロンは任意。ただし、複数のstatementsを1行に書きたい場合は必須