4.

Swiftのデータ型|Int・String・Bool・Optionalの基本と型推論

編集

Swiftのデータ型とは、値が「どんな種類の情報か(整数・小数・文字列・真偽値など)」をコンパイラに伝えるための分類であり、Swiftでは型を厳密に区別する静的型付けを採用しているため、変数や定数を扱う前に必ずいずれかの型が決まります。

この記事の要点
  • 基本型はInt(整数)・Double / Float(小数)・Bool(真偽値)・String(文字列)・Character(1文字)。
  • 型は型推論で自動決定され、型注釈let x: Int = 5)で明示もできる。
  • 値が「無いかもしれない」ことはOptionalInt?)で表し、nilを安全に扱う。
  • 複数の値はArray・Dictionary・Tupleなどのコレクション型でまとめる。
  • 基本型の多くは値型(struct)で、代入時にコピーされる。
  • 型同士は暗黙変換されないため、Int("5")のように明示的な型変換が必要。

主な基本データ型の一覧

まずSwiftでよく使う基本データ型を整理します。それぞれ用途と扱う値の種類が決まっており、目的に応じて使い分けます。

扱う値用途・例
Int整数個数・回数・添字など。例: 42-7
Double浮動小数点数(64ビット)小数を含む計算の標準。例: 3.14
Float浮動小数点数(32ビット)精度より省メモリを優先する場面。例: 1.5
Bool真偽値条件分岐。true / false
String文字列文章・名前など。例: "Hello"
Character1文字1文字単位の処理。例: "A"

小数を扱うときは、特別な理由が無ければDoubleを使うのが一般的です。Swiftでは小数リテラルの型をとくに指定しない場合、Doubleとして推論されます。

型推論と型注釈

Swiftでは、代入する値からコンパイラが型を自動で判断します。これを型推論と呼びます。たとえば整数を代入すればInt、文字列を代入すればStringになります。

let count = 5       // Int と推論される
let name = "Swift"  // String と推論される
let pi = 3.14       // Double と推論される

一方で、型を明示したいときは型注釈を使い、変数名のうしろに: 型名を書きます。値の型をはっきりさせたい場合や、初期値を後から代入する場合に役立ちます。

let x: Int = 5
let rate: Double = 0.5
var message: String     // 型だけ宣言し、あとで代入する

なお、値を変更しない場合はlet(定数)、変更する場合はvar(変数)を使います。型推論を使っても型注釈を使っても、いったん決まった型は途中で別の型に変わることはありません。

Optionalとnilの考え方

Swiftの大きな特徴がOptional(オプショナル)です。通常の型は必ず値を持ちますが、「値が存在しないかもしれない」状態を表したいときは、型名のうしろに?を付けたOptional型を使います。値が無い状態はnilで表します。

var score: Int? = 80  // 値あり
score = nil         // 値なしにできる

var total: Int = 80
// total = nil       // これはエラー。通常のIntにnilは入れられない

Optionalの中身を取り出すことをアンラップと呼びます。代表的な方法がif letによる安全な取り出しです。値があるときだけ処理を実行できます。

var score: Int? = 80

if let value = score {
    print(value)  // 値がある場合だけ実行される
} else {
    print("値がありません")
}

このしくみにより、「値が無いのに使おうとして起きる不具合」をコンパイル時点で防ぎやすくなっています。Optionalは、Swiftが安全性を重視していることを示す代表的な機能です。

コレクション型とTuple

複数の値をまとめて扱うための型も用意されています。代表的なものを挙げます。

特徴用途
Array順序を持つ並び同じ型の値を順番に並べる
Dictionaryキーと値の対応名前から値を引く
Set重複しない集まり一意な値の管理
Tuple複数の値の組異なる型をまとめて返す

let numbers = [1, 2, 3]            // Array<Int>
let ages = ["Taro": 20, "Hana": 18] // Dictionary<String, Int>
let point = (x: 10, y: 20)         // Tuple
print(point.x)                  // 10

ArrayやDictionaryは中に入れる値の型が決まっており、たとえば[Int]には文字列を混在させられません。これも型を厳密に区別するSwiftの考え方によるものです。

値型(struct)が中心であること

Swiftの基本型であるInt・Double・Bool・String・Array・Dictionaryなどは、いずれも値型(struct)として設計されています。値型は代入や関数への受け渡しのときに値がコピーされ、コピー元とコピー先は互いに影響しません。

var a = 10
var b = a    // b に値がコピーされる
b = 99
print(a)    // 10(a は変わらない)

この性質により、知らないうちに別の場所の値が書き換わるといった事態が起きにくく、動作を予測しやすくなります。

型変換

Swiftは型を自動で変換しないため、別の型へ変えたいときは明示的に型変換を行います。多くの型は、変換先の型名を関数のように呼び出して変換します。

let n = Int("5")    // String → Int?(変換できないとnil)
let d = Double(3)   // Int → Double(3.0)
let s = String(42)  // Int → String("42")

とくにInt("5")のような文字列から数値への変換は、文字列が数値として解釈できないこともあるため、結果はOptional(Int?になります。変換に失敗した場合はnilが返るので、前述のアンラップで安全に扱います。

つまずきやすいポイント

Swiftの型まわりで誤解されやすい点を整理します。いずれもSwiftが安全性と明確さを優先していることに由来します。

注意点内容
暗黙の型変換が無い他言語のように自動で型がそろうことはなく、型が違えばそのまま計算できない。明示的な変換が必要。
Int と Double の混在演算let r = 1 + 2.0 のような直接の混在演算はエラー。どちらかをそろえる必要がある。
Optionalのアンラップ忘れInt? をそのまま Int として使うことはできない。if let などで取り出してから使う。

let a = 10
let b = 2.0
// let c = a + b      // エラー:Int と Double はそのまま足せない
let c = Double(a) + b  // 12.0(型をそろえれば計算できる)

よくある質問(FAQ)

Q. 小数を扱うときはDoubleとFloatのどちらを使えばよいですか。
A. 特別な事情が無ければDoubleが推奨されます。Doubleの方が精度が高く、Swiftでも小数リテラルは標準でDoubleとして推論されます。省メモリが重要な場面に限ってFloatを検討します。

Q. letとvarはどう使い分けますか。
A. 値を変更しないものはlet(定数)、変更するものはvar(変数)にします。基本はletを使い、変更が必要なときだけvarにすると、意図しない書き換えを防ぎやすくなります。

Q. なぜOptionalがわざわざ用意されているのですか。
A. 「値が無い状態」を型のレベルで明示し、値が無いまま使ってしまう不具合をコンパイル時に防ぐためです。通常の型にはnilを入れられず、値が無いことを許す場所だけがOptionalになるため、安全に扱えます。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. print でデバッグ出力
  2. 変数の宣言
  3. 定数の宣言
  4. データ型
  5. 配列の宣言/追加/削除
  6. クラスとメソッドの作り方と呼び出し方
  7. 繰り返し制御
  8. if文による条件分岐
  9. エラー一覧

最近更新/作成されたページ