【Swift入門 #5】情報を保存する箱 - 変数varと定数let

Swiftプログラミングの基礎となる、変数と定数の概念と使い分けを初心者向けに解説します。

📚 Swift入門シリーズ: #3 Hello, World!#4 コメントと文法


プログラムでデータを扱うには、情報を保存する「入れ物」が必要です。この記事では、Swiftの変数(var)と定数(let)について学びましょう。

著者
著者: Sera
大学院でAI作曲に関して研究中!
来春からデータサイエンティストとして働く予定の技術オタク。
初心者
登場人物: あかり
流行りのAIやWeb技術に興味津々!
『知りたい』気持ちで質問を止められない、好奇心旺盛な学生。
normalの表情
初心者

前回はコメントとSwiftの基本文法ルールを学んだね!

専門家

そうだね。今回からは、変数や定数など、データを扱う方法を学んでいくよ。プログラミングの核心部分だね。

normalの表情
初心者

これまでで、Swiftの基本的な書き方やルールを学んできたね。コメントの書き方も覚えたよ!

専門家

そうだね。今回からは、データを扱う方法を学んでいくよ。プログラミングの核心部分だね。

normalの表情
初心者

これまで文字列を直接printに書いてたけど、同じ文字列を何度も使いたいときはどうすればいいの?毎回書くの面倒だな...

専門家

それが「変数」と「定数」の出番なんだ。変数と定数は、データを保存しておく「箱」のようなもので、名前をつけて何度も使えるんだよ。プログラミングの最も基本的で重要な概念なんだ。

excitedの表情
初心者

箱!名前をつけてデータを保存できるんだ!

定数(let)とは?

専門家

まず 定数 から説明するね。定数は、一度値を設定したら変更できない 入れ物なんだ。Swiftでは let キーワードを使って定数を作るんだよ。

let name = "太郎"
print(name)  // 太郎

この例では、name という名前の定数を作って、"太郎" という値を入れているんだ。そして、print(name) で定数に入っている値を表示しているんだよ。

confusedの表情
初心者

letって何?あと、=は「イコール」じゃないの?

専門家

いい質問だね。let は「定数を作りますよ」っていう宣言なんだ。英語の「let(〜させる)」から来ているんだよ。

そして、= は数学の「イコール(等しい)」とは少し違うんだ。プログラミングでは「代入演算子」って呼ばれていて、「右側の値を左側に入れる」という意味なんだよ。

let name = "太郎"

これを日本語で読むと、「name という定数に "太郎" を代入する」って意味になるんだ。矢印で表すと、"太郎" → name みたいなイメージだね。

happyの表情
初心者

なるほど!=は「代入」なんだね!

定数は変更できない

専門家

定数の重要な特徴は、一度値を設定したら変更できない ことなんだ。試しに変更しようとするとエラーになるよ。

let name = "太郎"
name = "花子"  // エラー:Cannot assign to value: 'name' is a 'let' constant

このように、定数に別の値を代入しようとすると、「let定数には代入できません」というエラーが出るんだ。

confusedの表情
初心者

変更できないなら不便じゃない?なんでそんなものがあるの?

専門家

素晴らしい疑問だね。実は、変更できないことが安全性につながる んだよ。

プログラムが大きくなってくると、うっかり値を変更してしまってバグになることがあるんだ。定数を使えば、「この値は絶対に変わらない」と保証できるから、安心してコードを書けるんだよ。

例えば、円周率や消費税率のように、プログラムの中で変わらない値は定数にするのが適切なんだ。

let pi = 3.14159
let taxRate = 0.10

これらは変更されることがないから、定数にしておくことで、誤って変更してしまうミスを防げるんだよ。

変数(var)とは?

normalの表情
初心者

じゃあ、値を変更したいときはどうすればいいの?

専門家

そこで 変数 の登場なんだ。変数は、値を変更できる 入れ物なんだよ。Swiftでは var キーワードを使って変数を作るんだ。

var score = 100
print(score)  // 100

score = 200
print(score)  // 200

この例では、score という変数を作って、最初は 100 を入れているんだ。その後、score = 200 で値を変更して、200 を入れ直しているんだよ。

excitedの表情
初心者

おお!値が変わった!

専門家

そうなんだ。var は「variable(変数)」の略で、「変わる」という意味があるんだよ。変数は、ゲームのスコア、ユーザーの入力、計算の途中結果など、プログラムの実行中に変化する値を扱うときに使うんだ。

重要なのは、変数の値を変更するときは varlet は書かない ってこと。

var age = 20  // 変数の宣言と初期化
age = 21      // 値の変更(var は書かない)

最初に var age = 20 と書くのは「変数を宣言して初期値を設定する」って意味なんだけど、2回目以降は age = 21 とだけ書くんだ。もし var age = 21 と書いてしまうと、「同じ名前の変数を2回宣言しようとしている」ってエラーになるんだよ。

変数の値を更新する

専門家

変数の値を更新する方法はいくつかあるんだ。直接新しい値を代入する他に、現在の値を使って計算することもできるんだよ。

var count = 10
print(count)  // 10

count = count + 5
print(count)  // 15

count = count * 2
print(count)  // 30

count = count + 5 は、「現在のcountの値に5を足して、その結果をまたcountに代入する」って意味なんだ。数学では「count = count + 5」は成り立たないけど、プログラミングでは「右辺を計算して、結果を左辺に代入する」から問題ないんだよ。

confusedの表情
初心者

count = count + 5 って、数学だとおかしいよね?

専門家

そうだね。数学では「count = count + 5」は「count - count = 5」つまり「0 = 5」になって矛盾するよね。でも、プログラミングの = は「代入」だから、順番に処理されるんだ。

  1. 右辺の count + 5 を計算(10 + 5 = 15)
  2. 計算結果の 15 を左辺の count に代入

この2ステップで考えるとわかりやすいよ。

複合代入演算子

専門家

実は、count = count + 5 のような書き方は頻繁に出てくるから、もっと短く書ける方法があるんだ。複合代入演算子 っていうんだよ。

var count = 10

count += 5  // count = count + 5 と同じ
print(count)  // 15

count -= 3  // count = count - 3 と同じ
print(count)  // 12

count *= 2  // count = count * 2 と同じ
print(count)  // 24

count /= 4  // count = count / 4 と同じ
print(count)  // 6

+= は「加算して代入」、-= は「減算して代入」、*= は「乗算して代入」、/= は「除算して代入」って意味なんだ。コードが短くて読みやすくなるから、よく使われるんだよ。

happyの表情
初心者

これは便利!短くて楽!

letとvarの使い分け

normalの表情
初心者

letとvar、どっちを使えばいいの?迷っちゃう...

専門家

これはとても重要な質問だね。Swiftのベストプラクティスは、基本的には let を使い、変更が必要な場合だけ var を使う ってことなんだ。

理由は、定数の方が安全だからなんだよ。値が変わらないことが保証されていると、バグが起きにくいし、コードの意図も明確になるんだ。

例を見てみよう。

// ユーザー情報(変更されない)
let userId = 12345
let userName = "山田太郎"

// ゲームのスコア(変更される)
var currentScore = 0
var lives = 3

// 計算結果(変更されない)
let totalPrice = 1000 + 80

userIduserName は一度設定したら変わらないから letcurrentScorelives はゲームの進行で変わるから var を使っているんだ。

もしコードを書いている途中で「あ、これ変更する必要があるな」って気づいたら、その時に let から var に変更すればいいんだよ。Xcodeも、「この定数は一度も変更されていないから let にできますよ」って教えてくれるんだ。

happyの表情
初心者

なるほど!まずはletで、必要ならvarに変えればいいんだね!

変数・定数の命名

normalの表情
初心者

変数や定数の名前って、どうやってつければいいの?ルールはあるの?

専門家

前回学んだ命名規則を思い出してね。変数と定数の名前は、キャメルケース で書くのが一般的なんだ。

let userName = "太郎"
var currentScore = 100
let maxRetryCount = 3

それと、意味のある名前をつける ことがとても重要なんだ。

// 悪い例
let x = "太郎"
var s = 100

// 良い例
let userName = "太郎"
var gameScore = 100

xs だけだと何の変数かわからないけど、userNamegameScore なら一目瞭然だよね。

名前をつけるときのコツをいくつか紹介するね。

具体的な名前をつける

let temperature = 25  // 「温度」という具体的な名前

省略しすぎない

// 悪い例
let usrNm = "太郎"

// 良い例
let userName = "太郎"

ブール値には is/has などをつける

let isLoggedIn = true
let hasPermission = false

複数形で配列を表現

let users = ["太郎", "花子", "次郎"]

こういった命名規則に従うことで、コードが読みやすくなるんだよ。

happyの表情
初心者

わかりやすい名前をつければ、後で見返したときも理解しやすいね!

値の初期化

confusedの表情
初心者

変数や定数って、宣言するときに必ず値を入れなきゃダメなの?

専門家

いい質問だね。実は、宣言と初期化を分けることもできるんだ。ただし、使う前には必ず値を設定しなければいけない んだよ。

let name: String
name = "太郎"
print(name)  // OK

この例では、最初に let name: String で定数を宣言だけして、次の行で値を代入しているんだ。: String は「この定数は文字列型ですよ」っていう 型注釈(タイプアノテーション) なんだよ。型については次の記事で詳しく説明するから、今は「値を後で入れる場合は型を書く必要があるんだな」って思っておいてもらえれば大丈夫。

もし、値を設定せずに使おうとするとエラーになるんだ。

let name: String
print(name)  // エラー:Constant 'name' used before being initialized

「初期化される前に使われています」ってエラーが出るんだよ。Swiftは、値が入っていない変数や定数を使うことを許さないんだ。これも安全性のための仕組みなんだよ。

normalの表情
初心者

じゃあ、宣言と同時に値を入れた方が楽だね!

専門家

そうだね。多くの場合は、宣言と同時に初期値を設定するのが一般的だよ。分ける必要があるのは、条件によって初期値が変わるような場合なんだ。でも、それは後で学ぶから、今は気にしなくて大丈夫だよ。

複数の変数・定数を宣言

専門家

複数の変数や定数を一度に宣言することもできるんだ。カンマで区切って書くんだよ。

let x = 10, y = 20, z = 30
print(x, y, z)  // 10 20 30

var a = 1, b = 2, c = 3
print(a, b, c)  // 1 2 3

ただし、これは読みにくくなることもあるから、関連性の高い値をまとめるとき以外は、1行に1つずつ書く方がわかりやすいことが多いんだよ。

練習問題

excitedの表情
初心者

実際に書いて練習してみたい!

専門家

いいね!じゃあ、練習問題をやってみよう。

問題1: 自分の名前と年齢を定数で定義して、それを使って自己紹介文を出力してみて。

// ここにコードを書いてね
normalの表情
初心者

やってみる!

let myName = "ビギナーちゃん"
let myAge = 18
print("私の名前は", myName, "です")
print("年齢は", myAge, "歳です")

できた!

専門家

完璧だね!次の問題も試してみよう。

問題2: 変数を使って、カウントアップするプログラムを書いてみて。0から始めて、1ずつ3回増やして、毎回値を出力してね。

excitedの表情
初心者
var counter = 0
print("カウント:", counter)  // 0

counter += 1
print("カウント:", counter)  // 1

counter += 1
print("カウント:", counter)  // 2

counter += 1
print("カウント:", counter)  // 3

こう?

専門家

素晴らしい!完璧だよ。複合代入演算子もちゃんと使えているね。

まとめ

この記事では、Swiftの変数と定数について学びました。

定数(let):

  • 一度値を設定したら変更できない
  • 安全性が高い
  • 基本的にはletを使うのが推奨

変数(var):

  • 値を変更できる
  • プログラムの実行中に変化する値に使う
  • 必要な場合のみ使う

重要なポイント:

  • = は代入演算子(右辺を左辺に代入)
  • 変数・定数名はキャメルケースで、意味のある名前をつける
  • 使う前に必ず値を設定する必要がある
  • 複合代入演算子(+=-=*=/=)で簡潔に書ける

次回は「基本的なデータ型①」として、文字列(String)と整数(Int)について詳しく学びます。データの種類とその扱い方を理解していきましょう!

← ブログ一覧に戻る