Codable Tech Blog

iPhoneアプリケーション開発と AWS(Amazon Web Service)活用に関する記事を配信

変数と定数

この記事はSwiftで利用される変数・定数、型について書いています。

変数と定数

変数および定数は値を後から再利用できるように値を保持する領域のことです。値を保存するには値を保存するための領域が必要になりますが必要な領域は保存する値によって異なります。たとえば、整数値なら4バイト、実数値なら8バイトの領域が必要です。値を保存するためにどの程度の領域を確保すればよいかを表現したものが「型」になります。

f:id:codable:20141009170021p:plain

変数および定数は値を格納している領域に対して名前をつけてデータを管理します。この名前のことを「変数名」とよびます。

変数に格納されている値はいつでも変更することが可能です。しかし、定数は一度設定した値を変更することはできません。

変数と定数の宣言

プログラム中で変数(定数)を利用する時は「宣言」が必要になります。「変数と定数の項」の説明した通り、値を保持するためには値を保持するための領域が必要であり、値を保存するのに必要な領域は「型」で表現する必要があります。Swiftでは次のようにして値を保持する変数(定数)を定義可能です。


    //var 変数名:型で変数を定義
    var number1:Int
    //let 定数名:型で定数を定義
    let number2:Int
	

変数を利用する場合、値を保持するためにどういった型を使用するのかを明示する必要があるのですが、Swiftは型推論という機能により、型を明示せずとも値を保持する領域を確保することができます。

変数の利用を宣言する場合はキーワード「var」

定数の利用を宣言する場合は、キーワード「let」

を利用します。

定数や変数に対して値を代入するには「=」演算子を利用します。
1行目は新しく定数constantNumを宣言し、値として10を設定しています。
2行目では新しく変数variableNumを宣言し、値として0を設定しています。
宣言と同時に値を設定することを「初期化」と呼びますが、Swiftでは初期化の際に代入した値に応じた適切な型を推論してくれます。この機能は型推論と呼ばれおり、変数に代入される値に応じて適切な型をコンパイラが自動で推論してくれます。 定数constantNumは一度、値を設定した後、値を変更することはできませんので3行目は「代入することができません」というコンパイルエラーが発生します。変数variableNumは値を置き換えることが可能ですので、4行目の処理を実行すると5という値が設定されます。

以下のようにカンマで変数を区切ることにより、複数の変数を一括で宣言することも可能です。

文はプログラムの実行単位です。 Swift以外の他のプログラミング言語では文の終端を示す時「;」を使用しています。 例えば、以下のような形です。 Swiftでは文の終端を表す「;」は必須ではありませんので、文の終端を示す「;」は省略することができます。(もちろん、;をつけても構いません。)ただし、もし、一行に複数の文を記述する場合は、文と文の区切りを示す;が必要となります。

コメント

プログラムで実行コードでない部分はコメントと呼びます。コメントは主にプログラム中のメモとして利用します。この処理はこういったことをしているよとかこの変数はこういう意味だよといったことをプログラムを読む人がすぐにわかるようにする意図でつけます。プログラム中でコメントを記述する方法として以下のような方法があります。
一行コメント コメントしたい箇所の先頭に「//」をつけます。
複数行コメント
複数行の場合はコメントの先頭位置に「/*」、コメントの終了位置に「/」をつけます。
また、複数行のコメントは入れ子にすることが可能です。それぞれのサンプルは以下の通りです。 上記はそれぞれ、プログラムの実行コードではありませんので、プログラムに対して影響は一切与えません。プログラムを始めて間もないうちは多めにコメントをつけて、理解を促進するようにするとよいですね。

型注釈

変数と定数の宣言で説明した通り、Swiftでは型推論という機能があるため、型を明示せずとも変数や宣言を利用することができます。しかし、型や定数に格納されている値の型を明示して、変数や定数を宣言することも可能です。Swiftでは変数や定数の型について明示することを型注釈と呼びます。
型注釈は以下のように記述します。なお、よく利用する代表的な型名については後述します。

var 変数名: 型名

これはInt型という型名の変数vNumを宣言しますということです。

Swiftには型推論という機能があり、変数に指定される初期値から型が自動で推論されますので、型注釈が必要となるのは変数に初期値を指定できない場合です。こういった場合、型推論が行えないので、型注釈で型を指定しないと変数や定数の型が不明のため、ビルドエラーが発生します。型注釈を利用して、型を指定してあげることでこのビルドエラーを修正することができます。

整数型

Swiftでは8bit、16bit,32bit,64bitの符号付きおよび符号無し整数型を提供しています。 符号付きとは負の値をとる整数のことです。一方、符号無しは正の値しかとりません。 符号付きの整数型はIntxx、符号無し整数はUIntxxという形になります。 xxには8、16、32、64のいずれかの数字がはいり、値が大きいほど表現できる数も多くなりますが、確保する領域も大きくなります。

それぞれの型の境界値はmin、maxプロパティを利用して知ることができます。プロパティとは各型が保持している特有の情報のことで、各型がもつプロパティには「型名.プロパティ名」でアクセスすることができます。例えば、UInt8のminとmaxプロパティは以下のようにしてアクセスすることができます。

UInt8.minは0、UInt8.maxは255が表示されるのが確認できます。これはUInt8型の変数は0から255までの値を格納できることを示しています。もし、範囲外の値を代入しようとするとビルドエラーが発生します。また、プログラム実行時に範囲外の値を設定しまうと、実行時エラーが発生し、プログラムが終了しますので注意しましょう。 いくつかの整数型を紹介しましたが、たいていの場合、わざわざどのbitの整数を利用するかを指定する必要はありません。というのもSwiftではInt型が提供されているからです。これは、プログラムが実行されるプラットフォームによって適切な整数型を提供してくれます。また、同様に符号無し整数型としてUIntも提供してくれています。 iNum4は32bit環境で実行されるならばInt32型で宣言され、64bit環境で実行されるならばInt64になります。iNum5は32bit環境で実行されるならばUInt32型で宣言され、64bit環境で実行されるならばUInt64になります。

実数型

実数を表現するための型として2つの型を用意されています。 Doubleは64bitで実数を表現する型になります。
Floatは32bitで実数を表現する型になります。

Bool

Boolは論理値(真か偽か)を表現するために利用する型です。 Boolでは真を表現するのにtrue、偽を表現するのにfalseを利用します。

String

Stringは文字列を表現するために利用する型です。
Swiftではダブルクォーテーション("")で囲った文字は文字列と見なされます。 ここでは、変数strigは文字列「aiueo」を保持する変数になります。

変数や定数に命名時に利用できる文字

変数の名前にはユニコードに属する文字が利用できます。但し、以下の点に注意してください。 * 変数名にスペースを使用してはいけない * 変数名に数学演算子を使用してはいけない * 変数名は数字を先頭にしてはいけない

変数名に含めることができない文字は他にも存在しますが、その文字を変数名として利用する可能性は低いため、ここでは割愛します。 変数の型は後から変更できず、型と異なる値をその変数に代入することはできないので注意してください。

値の表示

printを用いることでXCodeのコンソールペイン上に任意の文字を出力することができます。 変数の値を出力したい時は/()を利用します。 printの文字の中で値を表示したい変数を/()で囲むことで¥変数の値が展開され、コンソールペインに結果が出力されます。

リテラル

リテラルはソースコード上で値(数字や文字)を表現するための記法です。

数値リテラル

整数リテラルは以下のような形で記述することができます。
*2進数の場合、先頭に0bをつける *8進数の場合、先頭に0oをつける *16進数の場合、先頭に0xをつける *10進数の場合、特に特別な指定はなし 10のx乗を表現するために、「e」を利用できます。 実数の場合も整数同様にリテラル記法が用意されており、特に特別な記述は必要なく、実数をそのまま記述するだけです。 また、数値リテラルではプログラムを読む人が理解できやすいように、数値の先頭を0埋めしたり、_による桁の区切りを明示することができます。

数値の型変換

整数型には値が格納できる幅によりいくつかのタイプが存在します。もし、異なる整数型同士を組み合わせて計算をしたい時は、既に存在する値に対して型変換を行って新しい値を生成してあげる必要があります。既に存在する値をもとに新しい型の値を生成するには以下のように記述します。
新しい型名(既存の値) 6行目の処理は型が異なっているため、足し算が行なえないというコンパイルエラーが発生します。このため、8行目でInt8型の変数testInt8をInt16型に型変換しています。Int16(testInt8)と記述することでtestInt8の値をもとにInt16型の値を新しく生成できます。こうすることでInt16型同士の足し算となるので、コンパイルエラーを解消することができます。

同様の考え方で整数から実数への型変換、実数から整数への型変換も可能です。 3行目のInt(doubleNum)はDouble型からInt型へ型変換しています。Double型からInt型へ型変換するとdoubleNumの値が15.5ではなく、15(整数)となってしまいます。このため、addIntNumの値は15となります。4行目のDouble(intNum)はInt型からDouble型への型変換になります。この場合、addDoubleNumは15.5という値になります。

(補足)型安全と型推論

型安全とはある型に対する誤った操作を検出できることを指します。Swiftは型安全な言語です。例えばString型の変数にString型の値しか代入できません。このString型の変数にint型の値を代入するという誤った操作を行った場合、Swiftはこの間違いを検出することが可能です。型チェックを行うからといって、すべての変数や定数に型を指定しないといけないわけではありません。 Swiftでは型推論の機能があります。型推論とはコンパイル時に値に応じた適切な型を推測して型付けを行う機能です。 型推論がもっとも役に立つ場面が変数や定数を初期化する時です。変数や定数の宣言時に初期値が決定していれば、コンパイラが初期値に応じた型を自動で変数に設定してくれますので、変数に型を指定する必要はありません。