タプル とは複数の値を一つの値にまとめる機能。
タプルの制限は特になく、
- 型の制限なし
- 異なる型の値どうしでも良い。
タプルの宣言
下記例、(404, "Not Found") は HTTPステータスコード を示すタプルである。
let http404Error = (404, "Not Found")
// http404Error は (Int, String)型であり、(404, "Not Found")の値を持つ。
(404, "Not Found")を持つタプルは「Int型 と String型 のタプル」と言い表す。
タプルにおいて順番の規則は特になく、また必要なだけ異なる型の値を格納できる。例えば(Int, Int, Int)でも、(String, Bool)でもよい。
タプルの値にアクセスするには
タプルが持つ値をそれぞれ定数・変数に格納してアクセスするには下記のような手法を取る。
let (statusCode, statusMessage) = http404Error
print("The status code is \(statusCode)")
// "The status code is 404" とプリント
print("The status message is \(statusMessage)")
// "The status message is Not Found" とプリント
複数ある値のうち幾つかだけを定数・変数に格納したい場合は、不要な値にあたるタプル値の順を _ で埋めておく。
let (justTheStatusCode, _) = http404Error
print("The status code is \(justTheStatusCode)")
// "The status code is 404" とプリント。
インデックスを使ってタプルの値にアクセスするには
もしくは、タプルが持つ値のうち特定の値にアクセスするにはゼロで始まるインデックス番号を添えてアクセスできる。
print("The status code is \(http404Error.0)")
// "The status code is 404" とプリント。
print("The status message is (http404Error.1)")
// "The status message is Not Found" とプリント
値に名前を付けてタプルを宣言するには
もしくは、タプルを宣言する際に値に名前をつけておくこともできる。
let http200Status = (statusCode: 200, description: "OK")
名前を持つタプルの値にアクセスするには
名前を指定してタプルの値にアクセスするには下記手法を取る。
print("The status code is \(http200Status.statusCode)")
// "The status code is 200" とプリント。
print("The status message is \(http200Status.description)")
// "The status message is OK" とプリント。
タプルは関数の戻り値を取得する際が特に有効。
関数の仕組みとして、関数は戻り値に一つの値しか返せないが、タプルが複数の値を一つに取りまとめられるので、タプルを戻り値とすれば複数の値を得ることができるようになる。
例えば、ウェブサイトの状態を確認して、ステータスコードとメッセージを関数の戻り値としたい場合、タプルが必要になる。
この詳細については、 Functions with Multiple Return Values にて。
タプルは関連性のある複数の値をテンポラリで扱う際に利用すべき。
それはタプルが複雑なデータ構造を作ることに向いてないため。もし取り扱おうとしている複数の値がテンポラリなものでなく永続的な
ものであるならば、「クラス」か「構造体」を使うべき。詳細は *Classes and Structures* を参考にすること。