Swift

【swift入門 文法編 】変数・定数・型について

この記事ではswiftの変数・定数について、基本的な型について学習していきます。
swiftを始める上で一番基本的な内容になります。
プログラミングがはじめての人も、他の言語をやっていてswiftははじめての人にもわかるように説明していきたいと思います。

変数・定数とは

変数と定数とは、値を記憶するための入れ物です。
変数・定数ともに名前・型・値を持ちます。

変数と定数の違いは、名前の通りで記憶した値が変更可能なのが変数、変更不可能なのが定数になります。

宣言方法

変数と定数は以下のように宣言します。


var 変数名: 型名 //変数の宣言
let 定数名: 型名 //定数の宣言

変数を宣言する場合はvar、定数を宣言する場合はletを使います。
それぞれ名前の後に:をつけて、その後に型名を記述します。
この:型名の部分を「型アノテーション」といいます。

具体的な内容だと以下のようになります。


var a: Int    //変数名aで整数を表すInt型の変数を宣言
let b: String //定数名bで文字列を表すString型の定数を宣言

値の代入

変数・定数に値を記憶させることを、代入といいます。
以下のように書くことで変数x1という値が代入されます。


x = 1

=の右に記憶したい値を記述することで代入することができます。
プログラミングの世界での=と数学で使う=とは意味が異なってくるので注意が必要です。

以下の例を見てみてください。


var x: Int
x = 1
x = x + 1 //2

この例は数学では成立しませんが、プログラミングの世界では2行目でxx+1の値が代入されるので、最終的にxの値は2になります。

宣言と代入は同時に行うことができて、一般的には同時に行う場合が多いです。


//変数を宣言と代入
var a: Int = 3
//定数を宣言と代入
let b: String = "bbb"

最初の方でちらっと説明したように、変数には値を何回でも代入できます。それに対して変数は1度しか代入をすることができません。


var a: Int = 0
a = 3
a = 10 //何回でも代入可能

let b: String = "bbb"
b = "bbbbb" //コンパイルエラー

宣言時の型と異なった型の値を代入するとコンパイルエラーになってしまいます。


//"aaa"はInt型ではないのでコンパイルエラー
let a: Int = "aaa"

var b: String = "bbb"
//String型ではない値を代入してるのでコンパイルエラー
b = 0

初期化

宣言した変数や定数への最初の代入を「初期化」といいます。

変数や定数を初期化する前に使用するとコンパイルエラーとなります。


var a: Int
print(a) //コンパイルエラー

let b: String
print(b) //コンパイルエラー

逆に言うと使用する前までに初期化すればいいので以下の例はコンパイルエラーにはなりません。


let a: Int
let flag: Bool = true

if flag {
  a = 1
} else {
  a = 2
}

print(a) //1

letを使う場合2回代入ができませんが、このような場合はif文の分岐では片方しか通らなくて代入が1回しか行われないことが文法的に保証されているため有効なコードになります。
if文に関しては今後の記事で説明していきますので、わからない方はなんとなくでスルーして大丈夫です。

型推論

swiftには「型推論」という機能もあります。

先程の宣言と代入を同時に行った例をもう一度見ていきます。


var a: Int = 3

こちらですが、3という値からInt型だとわかるため、仮に型アノテーションの: IntがなかったとしてもaInt型だと推論できます。
これをswiftはプログラミング言語の機能として行ってくれるので、以下のように書くことができます。

var a = 3

このように値から型がわかるものを代入する場合、プログラムが文脈から判断してくれて型を決定してくれるので、型アノテーションを省略することができます。これが型推論です。

変数や定数の宣言時には型アノテーションか型推論の少なくとも一方を使って、型を決定する必要があります。
宣言時に型が決定できないとコンパイルエラーとなります。

let a //コンパイルエラー

型推論では型アノテーションを省略することができるので、コードをより簡潔に書くことができるというメリットがあります。しかし、型推論の処理があることによってコード量が多くなるに連れてビルド時間が長くなるというデメリットもあるので、一長一短ではあります。

両方の性質を理解した上で、開発するアプリの規模感やチームの方針など考慮した上でどちらを採用するかを決定するのがいいと思います。

変数・定数・型に関して 応用編

先程までは変数・定数・型に関しての基本事項を紹介しました。
ここからは、よりステップアップするためのポイントをいくつか紹介していきます。

型の確認方法

型関連のコンパイルエラーはswiftをそこそこ書ける人であってもよく起こります。ですが宣言した変数・定数の型を1つずつ確認していけばすぐに解決することが多いです。

Xcodeでの型の確認方法を説明します。
以下のGif画像の用に、右のタブを出現させ、「?」のマークの部分をクリックすることで「Quick Help」の画面になります。それで確認したい変数・定数にカーソルを当てることで型を確認できます。

sampleという変数は型推論でInt型と推論されていることが確認できました。

このように型を確認することは非常に重要で、やり方を覚えておきましょう。

名前に関して

変数や定数には、日本語や絵文字も使用することができます。
しかし、実際には使わずに、アルファベットと数字でだけを使用することが一般的です。

アルファベットに関して、大文字も小文字も使用することができますが、変数・定数名に関しては小文字で構成することが一般的です。


let sample: Int
var example: String

変数名・定数名が2単語以上になる場合は、先頭の単語以外の単語の先頭を大文字でつなぐローワーキャメルケース」を使うのが一般的です。

 


//ローワーキャメルケース
let constantName
//アッパーキャメルケース
ConstantName
//スネークケース
constant_name

こちらはどの記述だったとしてもエラーにはなりませんが、統一感のあって読みやすいコードを書くために記述方法と使い分けをある程度理解することは大切です。

変数と定数の使い分け

ここまでで変数と定数の使い方をまとめてきました。
ここでは変数と定数をどう使い分けていくべきかを説明していきます。

変数と定数の違いは、これまでも説明してきましたが、再代入可能かどうかです。
なので再代入する場合は変数を使い、しない場合は定数を使いましょう、というのが文法上の話です。

ステップアップするために意識してほしいのが、「変数を極力使わないようにする」ということです。

まずは以下の例を見てみましょう。

こちらはvarで変数を宣言しましたが、特に再代入はせずにいるとXcodeからVariable '変数名' was never mutated; consider changing to 'let' constant. Replace 'var' with 'let'と注意されています。(playgroundでは出てこないです)

これは値を変更しないならletに変えましょう、と促してくれています。
このことから、letで行ける場合には極力letを使用するべきという言語的な思想が読み取れます。

変数は極力使わないほうがいいというのはswiftに限らずプログラミング共通のセオリーです。
定数にして値を変更不可能にすることによって、

  • 値が予期しないところで書き換わってしまいエラーの原因となるリスクを防げる
  • コードを読む際に定数の宣言箇所だけ見れば値がわかるのでコードが読みやすい

といったメリットがあります。

最初のうちは難しいので、慣れてきたら意識できるといいのではないかなと思います。

まとめ

今回は変数・定数についてまとめていきました。
今回の内容は基本的なないようなのでしっかり理解しておけるといいかと思います。

swiftの入門記事に関してはこちらにまとめていますので参考にしてみてください。

〜初心者でもわかるswift入門〜基本文法からiOSアプリを開発するまでこのシリーズではプログラミング初心者の人や、swiftを初めて触れる人、やってみたもののよくわからないという人向けに、swiftの基本文法から実際に動くiOSアプリをXcodeで開発するところまでを解説します。...