2019/12/7 Swift タプル(tuple)

タプル(tuple)とは

タプルは複数の値をまとめた値。

複数の値はどんな型でも良い。異なる型でも良い。

複数の値をカンマで区切り、丸カッコで囲む。

sample1-1 タプルの例

let tpl1=(1,2,3,4)  //Int型の要素を持つタプル
let tpl2=("one","two","three")  //String型の要素を持つタプル
let tpl3=("iphone",11) //異なる型の要素を持つこともできる。
print(type(of:tpl1))
print(type(of:tpl2))
print(type(of:tpl3))
//(Int, Int, Int, Int)
//(String, String, String)
//(String, Int)

type関数は変数の型を調べることができます。

tpl1は(Int, Int, Int, Int)型のタプルである、と表現します。

タプル内の要素の型の種類・順番に制限はありません。



タプルの各要素へのアクセス、各要素の値を取り出す

sample2-1(インデックス番号によるタプルの要素へのアクセス)

let tpl1=(10,20,30,40)
print("first=\(tpl1.0),second=\(tpl1.1),third=\(tpl1.2),fourth=\(tpl1.3)")
//first=10,second=20,third=30,fourth=40

タプルの各要素へのアクセスはsample2-1のように0から始まるインデックス番号を用いてアクセスできます。他の言語を知ってる人は、tpl1.0のような記述法は少し奇妙な感じがするかもしれませんが、これでいけます。


sample2-2-1(タプルの要素名を指定して各要素へアクセス)

let tpl1_1=(first:100,second:200,third:300,fourth:400)
print("first=\(tpl1_1.first),second=\(tpl1_1.second),third=\(tpl1_1.third),fourth=\(tpl1_1.fourth)")
//first=100,second=200,third=300,fourth=400

タプルの各要素へ要素名をつけて、要素名を使用して各要素へアクセスすることもできます。その方法がsample2-2。sample2-2ではタプルの各要素に「first」「second」「third」「fourth」という要素名をつけて、変数tpl1_1へセット。

tpl1_1の各要素へはtpl1_1.firstのような記述でアクセスできます。


sample2-2-2

var tpl1=(first:1,second:2)
print(tpl1)

tpl1=(first:10,second:20)  //(1)要素名・Int型、共に一致している。代入可能
print(tpl1)

tpl1=(100,200)  //(2)要素名がない。この場合要素名は推測されるので代入可能
print(tpl1)
//(first: 1, second: 2)
//(first: 10, second: 20)
//(first: 100, second: 200)

sample2-2-2で変数tpl1は型注釈はありませんが、「(first:Int,second:Int)型」と型推定されます。つまり要素名も型の一部として型チェックされる、ということですね。上記(1),(2)は問題なく代入できます。

sample2-2-3

var tpl1=(first:1,second:2)
print(tpl1)

tpl1=(first:10,second:20)
print(tpl1)

tpl1=(100,200)
print(tpl1)

tpl1=(uno:100,dos:200)  //(3)要素名が不一致。つまり型が不一致なのでエラー。
error: MyPlayground.playground:18:6: error: cannot assign value of type '(uno: Int, dos: Int)' to type '(first: Int, second: Int)'
tpl1=(uno:100,dos:200)

変数tpl1は(first:Int,second:Int)型と型推定されていますので、その変数に(uno:Int,dos:Int)型のタプル値を代入しようとしている(3)はエラーになります。


sample2-3

let tpl1=(10,20,30,40)

let first=tpl1.0
let second=tpl1.1
let third=tpl1.2
let fourth=tpl1.3

print("first=\(first),second=\(second),third=\(third),fourth=\(fourth)")
//first=10,second=20,third=30,fourth=40

タプルtpl1の各要素を定数first,second,third,fourthにセットしたい場合上記sample2-3のようにすればできますが、もっとシンプルな方法があります。下記sample2-4をご覧ください。

sample2-4 分割代入的にタプルの各要素を各定数へ代入する)

let tpl1=(10,20,30,40)

let (first,second,third,fourth)=tpl1

print("first=\(first),second=\(second),third=\(third),fourth=\(fourth)")
//first=10,second=20,third=30,fourth=40

例えばtpl1の最初の要素とその次の要素だけが必要で、3番目と4番目の要素は必要ない場合sample2-5のように不要な部分をアンダースコア( _ )にすることで、必要な要素のみ取り出すことができます。

sample2-5

let tpl1=(10,20,30,40)

let (first,second,_,_)=tpl1
print("first=\(first),second=\(second)")
//first=10,second=20

参考

https://docs.swift.org/swift-book/ReferenceManual/Types.html

(Tuple Type)

https://docs.swift.org/swift-book/LanguageGuide/TheBasics.html

(Tuples)



 

コメントを残す

メールアドレスが公開されることはありません。