【Swift】タプルの使い方。型を混在させられるデータの詰め合わせ。(Swift 2.1、XCode 7.2)
タプルの宣言
プログラミングの世界で使われる「タプル」とは、順序付けられた複数データの集合体のことをいう。Swiftではこのデータの集合を1つの変数として扱うことができる。
変数 = (データ、データ、データ、、、)
タプルを利用すれば、構造体やクラスを使わずに簡単にデータの詰め合わせを作ることができる。また、関数呼び出しの戻り値にタプルを利用すれば、簡単に複数の値を戻すコードが書ける。
タプルは以下のコードのように「(データ,データ,データ,..)」と宣言する。データ型の種類が混在しても問題ない。ただし、宣言したあとにデータの追加や削除はできない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//タプルの宣言 var person = ("田中", 35, 170.0) print(person) //実行結果 //("田中", 35, 170.0) //型も一緒に宣言する var person2:(String, Int, Double) = ("田中", 35, 170.0) print(person2) //実行結果 //("田中", 35, 170.0) //ラベルをつけて宣言する var person3:(name:String, age:Int, height:Double) = ("田中", 35, 170.0) print(person3) //実行結果 //("田中", 35, 170.0) |
通常の変数と同様に、タプルもオプショナル型変数として宣言することもできる。オプショナル型変数については次の記事を参照されたし。⇒「記事」
1 2 3 4 5 6 7 8 |
//オプショナル型の変数として定義する var person4:(String, Int, Double)? person4 = ("田中", 35, 170.0) print(person4!) //実行結果 //("田中", 35, 170.0) |
タプルに格納できるデータの個数に制限は無いようだが、試しに、1から順番にたくさん入れて見たところ、2600個くらいでPlaygroundがクラッシュログを出力した。
1 2 3 4 5 |
var person = (1,2,3,4,省略,2597,2598,2599) //実行結果 //The playground service "com.apple.dt.Xcode.Playground" may havegenerated a crash log." |
タプルから値を取得する。
タプルから値を取得する方法は複数ある。
以下のコードはインデックス番号を指定してタプルの値を取得する方法。1つめの要素のインデックス番号が0から始まることに注意。
1 2 3 4 5 6 7 8 9 10 11 |
//インデックス番号を指定して取得する var person5:(String, Int, Double) = (name:"田中", age:35, height:170.0) print(person5.0) //1つ目を取得 print(person5.1) //2つ目を取得 print(person5.2) //3つ目を取得 //実行結果 //田中 //35 //170 |
以下のコードはタプルの値につけたラベルを指定して取得する方法。正確な理由は分かり次第追記するが、ラベル付きでデータ型を宣言する場合は、型の隣りにラベルを書かないと値にアクセスできなくなるので気をつけよう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//ラベルで値を取得する var person6 = (name:"田中", age:35, height:170.0) print(person6.name) //実行結果 //田中 //型宣言をするときは、型の横にラベルをつける var person7:(name:String, age:Int, height:Double) = ("田中", 35, 170.0) print(person7.name) //実行結果 //田中 //値の横にラベルを付けると、ラベルで値を取得できない var person8:(String, Int, Double) = (name:"田中", age:35, height:170.0) print(person8.name) //実行結果 //error: value of tuple type '(String, Int, Double)' has no member 'name' |
以下のコードはタプルと同じ個数の変数を宣言して値を格納する方法。変数の個数をタプルと一致させる必要があることに注意。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//タプルと同じ個数の変数に格納する。 var person9:(String, Int, Double) = (name:"田中", age:35, height:170.0) var (test1,test2,test3) = person9 print(test3) //実行結果 //170.0 //タプルと変数の個数が異なる場合はエラーになる。 var person10:(String, Int, Double) = (name:"田中", age:35, height:170.0) var (test3,test4) = person10 //実行結果 //error: '(String, Int, Double)' is not convertible to '(@lvalue (String, Int, Double), @lvalue (String, Int, Double))', tuples have a different number of elements //取得する必要がないタプルの値はアンダースコアで数合わせすれば、エラーは発生しない var person11:(String, Int, Double) = (name:"田中", age:35, height:170.0) var (test5,test6,_) = person11 print(test6) //実行結果 //35 |