📚 Swift入門シリーズ: #3 Hello, World! → #4 コメントと文法
プログラムでデータを扱うには、情報を保存する「入れ物」が必要です。この記事では、Swiftの変数(var)と定数(let)について学びましょう。
来春からデータサイエンティストとして働く予定の技術オタク。
『知りたい』気持ちで質問を止められない、好奇心旺盛な学生。
前回はコメントとSwiftの基本文法ルールを学んだね!
そうだね。今回からは、変数や定数など、データを扱う方法を学んでいくよ。プログラミングの核心部分だね。
これまでで、Swiftの基本的な書き方やルールを学んできたね。コメントの書き方も覚えたよ!
そうだね。今回からは、データを扱う方法を学んでいくよ。プログラミングの核心部分だね。
これまで文字列を直接printに書いてたけど、同じ文字列を何度も使いたいときはどうすればいいの?毎回書くの面倒だな...
それが「変数」と「定数」の出番なんだ。変数と定数は、データを保存しておく「箱」のようなもので、名前をつけて何度も使えるんだよ。プログラミングの最も基本的で重要な概念なんだ。
箱!名前をつけてデータを保存できるんだ!
定数(let)とは?
まず 定数 から説明するね。定数は、一度値を設定したら変更できない 入れ物なんだ。Swiftでは let キーワードを使って定数を作るんだよ。
let name = "太郎"
print(name) // 太郎
この例では、name という名前の定数を作って、"太郎" という値を入れているんだ。そして、print(name) で定数に入っている値を表示しているんだよ。
letって何?あと、=は「イコール」じゃないの?
いい質問だね。let は「定数を作りますよ」っていう宣言なんだ。英語の「let(〜させる)」から来ているんだよ。
そして、= は数学の「イコール(等しい)」とは少し違うんだ。プログラミングでは「代入演算子」って呼ばれていて、「右側の値を左側に入れる」という意味なんだよ。
let name = "太郎"
これを日本語で読むと、「name という定数に "太郎" を代入する」って意味になるんだ。矢印で表すと、"太郎" → name みたいなイメージだね。
なるほど!=は「代入」なんだね!
定数は変更できない
定数の重要な特徴は、一度値を設定したら変更できない ことなんだ。試しに変更しようとするとエラーになるよ。
let name = "太郎"
name = "花子" // エラー:Cannot assign to value: 'name' is a 'let' constant
このように、定数に別の値を代入しようとすると、「let定数には代入できません」というエラーが出るんだ。
変更できないなら不便じゃない?なんでそんなものがあるの?
素晴らしい疑問だね。実は、変更できないことが安全性につながる んだよ。
プログラムが大きくなってくると、うっかり値を変更してしまってバグになることがあるんだ。定数を使えば、「この値は絶対に変わらない」と保証できるから、安心してコードを書けるんだよ。
例えば、円周率や消費税率のように、プログラムの中で変わらない値は定数にするのが適切なんだ。
let pi = 3.14159
let taxRate = 0.10
これらは変更されることがないから、定数にしておくことで、誤って変更してしまうミスを防げるんだよ。
変数(var)とは?
じゃあ、値を変更したいときはどうすればいいの?
そこで 変数 の登場なんだ。変数は、値を変更できる 入れ物なんだよ。Swiftでは var キーワードを使って変数を作るんだ。
var score = 100
print(score) // 100
score = 200
print(score) // 200
この例では、score という変数を作って、最初は 100 を入れているんだ。その後、score = 200 で値を変更して、200 を入れ直しているんだよ。
おお!値が変わった!
そうなんだ。var は「variable(変数)」の略で、「変わる」という意味があるんだよ。変数は、ゲームのスコア、ユーザーの入力、計算の途中結果など、プログラムの実行中に変化する値を扱うときに使うんだ。
重要なのは、変数の値を変更するときは var や let は書かない ってこと。
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」は成り立たないけど、プログラミングでは「右辺を計算して、結果を左辺に代入する」から問題ないんだよ。
count = count + 5 って、数学だとおかしいよね?
そうだね。数学では「count = count + 5」は「count - count = 5」つまり「0 = 5」になって矛盾するよね。でも、プログラミングの = は「代入」だから、順番に処理されるんだ。
- 右辺の
count + 5を計算(10 + 5 = 15) - 計算結果の 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
+= は「加算して代入」、-= は「減算して代入」、*= は「乗算して代入」、/= は「除算して代入」って意味なんだ。コードが短くて読みやすくなるから、よく使われるんだよ。
これは便利!短くて楽!
letとvarの使い分け
letとvar、どっちを使えばいいの?迷っちゃう...
これはとても重要な質問だね。Swiftのベストプラクティスは、基本的には let を使い、変更が必要な場合だけ var を使う ってことなんだ。
理由は、定数の方が安全だからなんだよ。値が変わらないことが保証されていると、バグが起きにくいし、コードの意図も明確になるんだ。
例を見てみよう。
// ユーザー情報(変更されない)
let userId = 12345
let userName = "山田太郎"
// ゲームのスコア(変更される)
var currentScore = 0
var lives = 3
// 計算結果(変更されない)
let totalPrice = 1000 + 80
userId や userName は一度設定したら変わらないから let、currentScore や lives はゲームの進行で変わるから var を使っているんだ。
もしコードを書いている途中で「あ、これ変更する必要があるな」って気づいたら、その時に let から var に変更すればいいんだよ。Xcodeも、「この定数は一度も変更されていないから let にできますよ」って教えてくれるんだ。
なるほど!まずはletで、必要ならvarに変えればいいんだね!
変数・定数の命名
変数や定数の名前って、どうやってつければいいの?ルールはあるの?
前回学んだ命名規則を思い出してね。変数と定数の名前は、キャメルケース で書くのが一般的なんだ。
let userName = "太郎"
var currentScore = 100
let maxRetryCount = 3
それと、意味のある名前をつける ことがとても重要なんだ。
// 悪い例
let x = "太郎"
var s = 100
// 良い例
let userName = "太郎"
var gameScore = 100
x や s だけだと何の変数かわからないけど、userName や gameScore なら一目瞭然だよね。
名前をつけるときのコツをいくつか紹介するね。
具体的な名前をつける
let temperature = 25 // 「温度」という具体的な名前
省略しすぎない
// 悪い例
let usrNm = "太郎"
// 良い例
let userName = "太郎"
ブール値には is/has などをつける
let isLoggedIn = true
let hasPermission = false
複数形で配列を表現
let users = ["太郎", "花子", "次郎"]
こういった命名規則に従うことで、コードが読みやすくなるんだよ。
わかりやすい名前をつければ、後で見返したときも理解しやすいね!
値の初期化
変数や定数って、宣言するときに必ず値を入れなきゃダメなの?
いい質問だね。実は、宣言と初期化を分けることもできるんだ。ただし、使う前には必ず値を設定しなければいけない んだよ。
let name: String
name = "太郎"
print(name) // OK
この例では、最初に let name: String で定数を宣言だけして、次の行で値を代入しているんだ。: String は「この定数は文字列型ですよ」っていう 型注釈(タイプアノテーション) なんだよ。型については次の記事で詳しく説明するから、今は「値を後で入れる場合は型を書く必要があるんだな」って思っておいてもらえれば大丈夫。
もし、値を設定せずに使おうとするとエラーになるんだ。
let name: String
print(name) // エラー:Constant 'name' used before being initialized
「初期化される前に使われています」ってエラーが出るんだよ。Swiftは、値が入っていない変数や定数を使うことを許さないんだ。これも安全性のための仕組みなんだよ。
じゃあ、宣言と同時に値を入れた方が楽だね!
そうだね。多くの場合は、宣言と同時に初期値を設定するのが一般的だよ。分ける必要があるのは、条件によって初期値が変わるような場合なんだ。でも、それは後で学ぶから、今は気にしなくて大丈夫だよ。
複数の変数・定数を宣言
複数の変数や定数を一度に宣言することもできるんだ。カンマで区切って書くんだよ。
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つずつ書く方がわかりやすいことが多いんだよ。
練習問題
実際に書いて練習してみたい!
いいね!じゃあ、練習問題をやってみよう。
問題1: 自分の名前と年齢を定数で定義して、それを使って自己紹介文を出力してみて。
// ここにコードを書いてね
やってみる!
let myName = "ビギナーちゃん"
let myAge = 18
print("私の名前は", myName, "です")
print("年齢は", myAge, "歳です")
できた!
完璧だね!次の問題も試してみよう。
問題2: 変数を使って、カウントアップするプログラムを書いてみて。0から始めて、1ずつ3回増やして、毎回値を出力してね。
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)について詳しく学びます。データの種類とその扱い方を理解していきましょう!