Swiftのタプル型

Swiftには複数の型の値をひとまとまりにして扱うことができるタプル型が存在します。
今回の記事ではタプル型についてまとめていきます。

タプル型の定義方法

タプル型とは、冒頭に記述した通り複数の型の値をまとめることができる型です。
タプル型を定義するには、()内に要素となる型を,区切りで列挙します。

// 要素にInt型、String型、Bool型の値を一つずつ持つタプル型の変数
var tuple: (Int, String, Bool)

// 同じ型の要素を複数持つことも可能
var tuple2: (Int, Int, String, String)

タプル型の値をタプルと言います。
タプルを生成する場合、()内に要素となる値を,区切りで列挙します。

var tuple: (Int, String, Bool)
// (Int, String, Bool)のタプルを生成しtupleに代入
tuple = (123, "abc", true)

// 定義した要素が足りないタプルは代入不可
tuple = (123, "abc") // コンパイルエラー

// 定義した要素の順番と異なるタプルは代入不可
tuple = (true, 123, "abc") // コンパイルエラー

タプルの代入をする場合、定義した型と要素数と順番が合わないものは代入できません。

タプルの要素名

タプルの要素には要素名を定義することができます。
要素名を定義する場合、タプルを定義する際に要素名を要素の前に”要素名: “の形で付加します。
要素名の定義は、型定義でもリテラルの生成でもどちらでも行うことができます。
型定義をした場合、値を代入した際はそれぞれ対応する値の要素に定義した時の要素名が割り振られます。

// タプルの型定義時に要素名を定義する
var tuple1: (int1: Int, str1: String, bool1: Bool)

// (Int, String, Bool)のタプルを生成しtuple1に代入
// それぞれの要素に定義した時の要素名が付く
tuple1 = (123, "abc", true)

// タプルのリテラル定義時に要素名を定義する
var tuple2 = (int2: 456, str1: "def", bool2: false)

要素名を定義したタプルの型へ代入する場合、同じ要素名を持つタプルであれば代入可能です。
しかし、定義と異なる要素名を持つタプルは例え型が同じであっても代入することはできません。

var tuple1: (int1: Int, str1: String, bool1: Bool)

// 定義時と同じ要素名のタプルの代入は可能
tuple1 = (int1: 789, str1: "ghi", bool1: true)

// 定義時と異なる要素名のタプルを代入しようとするとコンパイルエラーとなる
tuple1 = (int3: 987, str3: "jkl", bool3: false)

また、要素名を付ける要素と付けない要素を混在させることも可能です。

// 要素名を定義する要素と定義しない要素を混在させることもできる
var tuple2 = (int1: 456, "def", bool1: false)

タプルの要素へアクセス

タプルは複数の値を持つことのできる型であり、利用する際にはそれぞれ任意の値にアクセスする必要があります。
タプルの値へのアクセス方法はインデックスによるアクセスと要素名によるアクセスの2つの方法があります。

インデックスによるアクセス

インデックスとはタプルの要素にそれぞれ採番される番号です。
インデックスはタプルを定義した際に暗黙的に採番され、一番最初の要素を0として順に1,2,3,…と採番されていきます。
タプルの要素にインデックスを利用してアクセスする場合、タプルの後に”.アクセスしたい要素のインデックス”を付加することでアクセスすることができます。

var tuple = (123, "abc", true)

// インデックスによる要素へのアクセス
let int = tuple.0 // 123
let str = tuple.1 // "abc"
let bool = tuple.2 // true

要素名によるアクセス

要素名を定義したタプルの場合、要素名を利用したアクセスも可能です。
要素名によるアクセスは、タプルの後に”.アクセスしたい要素の要素名”を付加することでできます。

var tuple = (int: 123, str: "abc", bool: true)

// 要素名による要素へのアクセス
let int = tuple.int // 123
let str = tuple.str // "abc"
let bool = tuple.bool // true

タプルによる一括代入

タプルを利用して複数の変数や定数に一括で値を代入することができます。
()内に,区切りで変数や定数を列挙し、型と要素数が一致しているタプルを代入することで変数・定数に対応するタプルの値を一括で代入することができます。

let int: Int
let str: String

// intとstrにタプルによる一括代入を行う
(int, str) = (123, "abc")

print(int) // 123
print(str) // "abc"

また、タプルによる代入は変数・定数の宣言も同時に行うことができます。
()内に変数・定数を列挙する際にletやvarを付加することで定義も同時にできます。

// intとstrの定義と一括代入を同時に行う
let (int, str) = (123, "abc")

print(int) // 123
print(str) // "abc"

Void型

空のタプルをVoid型と言います。
Void型は値が存在し得ないことを表す型として扱われます。

() // Void型

nilも値がないことを表しますが、nilは値が存在する可能性がある箇所に値がないことを表すため、Void型とは異なります。
Void型の性質は戻り値を持たない関数を表す場合などに利用されます。

まとめ

今回は複数の型の値をまとめることができるタプルについてまとめました。
タプルを利用する際は型・要素数・順番などを意識し、正しく代入やアクセスを行う必要があります。
正しい方法を理解した上でコードへ反映させていきたいですね。
最後までお読みいただきありがとうございました。
それでは、また。