- 更新日: 2018年12月21日
- 公開日: 2018年12月18日
【Swift】データ型について
プログラミング言語はデータを使って目的を実現する手段のため、プログラミング言語をマスターするためにはデータ型について知る必要があります。SwiftはC言語(Objective-C)をベースとしたデータ型をサポートしていますが、モダンな言語として、他の言語にはあまり見られない新しいデータ型も取り入れられています。それでは、早速、データ型について説明します。
動的型付けと静的型付けについて
データ型の説明の前に、データの型付けについて説明します。
どのプログラミング言語も、データを格納する変数とデータ型を持ちます。 プログラミング言語をデータ型という観点で分けると、動的型付け言語、静的型付け言語に分けることができます。 動的、静的は、データ型をいつ、誰が決めるかによって決まります。 一般的に、プログラムの規模が小さい場合、動的型付け言語が、規模が大きくなると静的型付け言語が好まれる傾向にあります。
モダンな言語であるSwiftやGo言語は静的な型付け言語ですが、動的型付け言語の持つメリット、事前処理(コンパイル)を明示的に行わなくても実行できる仕組みを持っています。
動的型付け言語
データ型を言語処理系が決める言語が動的型付け言語です。代表的な言語として、Javascript、PHP、Ruby、sh(シェル)があります。動的型付け言語はプログラミングコードを逐次実行(コンパイル&実行)します。インタプリタと呼ばれます。
メリット
データの型チェックなどを事前に行わないため、書いたプログラムをそのまま実行することができます。 小規模なプログラムの場合、このメリットは大きいです。たとえば、Unix系OSはsh(シェル)と呼ばれるテキストベースのプログラムを組み合わせていろいろなサービスを実行します。
デメリット
データ型のチェックを行わないため、実行時のデータによってデータ型が変わりエラーになってしますことがあります。例えば以下のような二つの処理の和を返却する関数があった場合、データ型によって返却値が異なります。処理1、処理2の返値がそれぞれ数値で、100, 200の場合、和は300になりますが、どちらか一方が文字列の場合、"100200"になります。 静的型付け言語の場合、処理1、処理2は数値を返すように宣言できるのでこのようなことに発生しません。
function sum() {
return 処理1() + 処理2();
}
静的型付け言語
データ型をプログラマが決める言語が静的型付け言語です。代表的な言語として、C言語、Java、Go、Swiftがあります。プログラマが書いたコードは事前にマシン語と呼ばれる機械(処理系)が理解できるコードに変換されます。この処理はコンパイルと呼ばれます。コンパイル時にデータの型チェックも行われるため、変数に異なるデータ型の値がセットされることはありません。コンパイルエラーが出力され実行フィルは作成されません。
メリット
安全。 コンパイル時にデータの型チェックが行われるため、実行時に予期しないエラーがでることが少ない。品質の高いアプリケーションを開発できます。
デメリット
コンパイルという手順が必要となります。大規模開発の場合に、各開発者が同じ開発(コンパイル)環境を構築するのは面倒な場合があります。
変数と定数
変数、定数はデータを格納できる領域で、名前とデータ型を持ちます。変数の場合、var、定数の場合letキーワードを使って宣言します。定数を変更しようとした場合コンパイルエラーになります。
let constValue = 0
var varValue = 1
constValue = 1 <--- コンパイルエラーになります
varValue = 2 <--- 値が更新されます
1行で複数の変数を宣言することもできます。
var x = 0.0, y = 0.0, z = 0.0
型アノテーション
変数、定数を宣言する場合、型アノテーションを付けることができます。変数名の後に:(コロン)をつけて、その後にデータ型、以下の例ではStringを追加します。
var welcomeMessage: String
変数に初期値をセットする場合、型アノテーションを省略することができます。
var welcomeMessage = "hello"
Swiftの処理系が変数の型を文字列型と推論してくれるためです。内部的に以下のように処理されます。
var welcomeMessage: String = "hello"
変数と同様に、1行で複数の変数に対して型アノテーションを付与することができます。
var red, green, blue : Double
データ型一覧
Swift言語がサポートしているデータ型一覧です。
Int
Integer、符号あり整数値です。取り扱うデータの範囲に応じて、Int8(8ビット)、Int16(16ビット)、Int32(32ビット)、Int64(64ビット)の4種類があります。配列、データ転送(ネットワーク)、ファイルなどデータ量が気になる場合を除けばIntを使うのが良いでしょう。
var num = 0
UInt
Unsigned Integer、符号なし整数値です。これも同じく8、16、32、64ビット版があります。
文字列
var message = "Hello"
Boolean
let orangesAreOrange = true
Tuples
Objective-Cにはない新しいデータ型です。
タプルは複数の値を一つにまとめて処理できます。
以下の例では、Httpのステータスコードをステータスコード(Int), メッセージ(String)の二つのデータとしてまとめて処理しています。
let http404Error = (404, "Not Found")
データを取り出す場合には、以下のようにして変数にセットします。名前を_(アンダースコア)にすれば、データは取り出されません。
let (statusCode, statusMessage) = http404Error
let (statusCode, _) = http404Error
値を変数に取り出さない場合、indexを使って直接タプルの値にアクセスすることもできます。
print("http status: \(http404Error.0)"
タプルは、名前付きの要素として宣言することもできます。
let http200Status = (statusCode: 200, description: "OK")
この場合、indexではなく名前で直接タプルの値にアクセスすることができます
print("http status: \(http200Status.statusCode)"
タプルは、関数の複数返値に使われます。
func minMax(array: [Int]) -> (min: Int, max: Int) {
// 最小値(currentMin)を求める処理
// 最大値(currentMax)を求める処理
return (currentMin, currentMax)
}
Optionals
Swiftが取り入れた新しいデータ型です。
プログラムの不具合(バグ)の原因に、データを格納した変数の値がnil(データ未設定)になるケースが挙げられます。Optional型は変数の値がnilになることを防ぐための言語仕様でサポートします。Optional型は変数(値)がnilになる可能性があることを示しており、この変数の値を安全に安全に取り出さないとコンパイルエラーになります。
Swiftでは、宣言の時に値をセットしてない変数はOptional型として宣言しなければなりません。Optionalは型の後ろにクエスチョンマーク(?)を付けます。
var num: Int?
var num1: Int ← コンパイルエラーになります。
この変数の値を取り出す(unwrapと呼びます)場合、以下のようにする必要があります。
if let safe_num = num {
この中では、safe_numはnilではありません。
} else { エラー処理}
Optiona型だけど確実に値が入っている場合、exclamation mark(ビックリマーク:!)を使って、 強制Unwrapすることもできます。UI部品のBindingに良く用いられます。
var force_unwrap = num!
Array
配列。複数のデータ格納することができます。
var subjects = {"英語", "国語", "算数"}
subjects[0] ← 国語
Dictionary
辞書。(キー、値)という形式のデータを複数格納できます。辞書の見出しと説明を思い出すとイメージしやすいと思います。
var scores = {"英語": 80, "国語": 75, "算数": 95}
scores["英語"] ← 英語の点数
Set
集合。辞書のキーの集まりです。キーは重複しないことが特長です。
数値データ型変換
型の名前を持つ関数を使うとデータの変換ができます。
浮動小数点→整数
関数Intを使って浮動小数点を整数に変換すします。
let pi = 3.141592
let integerPi = Int(pi) ← 3になる
整数→浮動小数点
let three = 3
let doubleThree = Double(three) ← 3.0
\Webサイト担当者としてのスキルが身に付く!!/
型エイリアス
型エイリアスを使うと既存のデータ型に別名を追加することができます。プログラム的にわかりやすくなります。 ``` typealias AudioType = UInt
AudioType.min ```
- この記事を書いた人
- 宇野 昌明