Edited at

SwiftのTupleを使う

More than 1 year has passed since last update.


Tuple(タプル)とは

型の異なる複数の値をひとまとめにできる。(ざっくり)


Tupleのリテラル

// 値のみ

(val1, val2, ...)

// 値に名前をつけられる
(name1: val1, name2: val2, ...)



Tupleをつかう


値のみで宣言


  • 0からの連番で参照する


値のみのTuple

var tpl = ("Qiita", 10, true)

println(tpl) // -> (Qiita, 10, true)

println(tpl.0) // -> Qiita
println(tpl.1) // -> 10
println(tpl.2) // -> true
println(tpl.3) // Error

tpl.1 = 20
println(tpl.1) // -> 20



値に名前をつけて宣言


  • つけた名前で参照できる

  • 連番でも参照できる


値に名前をつけたTuple

var tpl = (name: "Qiita", count: 10, flag: true)

println(tpl.name) // -> Qiita
println(tpl.count) // -> 10
println(tpl.flag) // -> true

println(tpl.0) // -> Qiita
println(tpl.1) // -> 10
println(tpl.2) // -> true



Tupleに変数名をつけない


  • まとめて変数宣言っぽいことができる


Tupleに変数名をつけない

var (name, count, flag) = ("Qiita", 10, true)

println(name) // -> Qiita
println(count) // -> 10
println(flag) // -> true


Tupleから指定した値のみ取り出す


  • 取得しない位置に_(アンダースコア)を入れる


Tupleから指定した値のみ取り出す

var (name, _, flag) = ("Qiita", 10, true)

println(name) // -> Qiita
println(_) // Error
println(flag) // -> true


Tupleで値を入れ替える


  • tmpてきな変数を用意する必要がない


Tupleで値を入れ替える

var n1 = 1

var n2 = 2
(n1, n2) = (n2, n1)
println(n1) // -> 2
println(n2) // -> 1


ネストしたTuple


  • 右辺と左辺のネスト構造が同じなら代入される


ネストしたTuple

var nest = (10, 20, (30, 40))

var (n1, n2, n3, n4) = nest // Error
var (n1, n2, (n3, n4)) = nest // 代入される


無駄なネスト


  • 無駄なネストは無視される?


無駄なネスト

var nest = (((((1)))), 2)

println(nest.0) // -> 1
println(nest.1) // -> 2

var (num1, num2) = nest // 代入される



間違えそうな例

// ネストの構造がおかしいのでnest.num1を参照するとErrorになる

var nest = (((((num1: 1)))), num2: 2)

// 通る
var nest = (num1: ((((1)))), num2: 2)
println(nest.num1) // -> 1
println(nest.num2) // -> 2



ArrayやDictionaryとの違い


  • 型の異なる値を入れられる

  • 繰り返し処理ができない

  • 値の追加/削除ができない

とか。


実はTupleはSwiftの基本となる値

すべての値は「値が1つだけのTuple」らしい。


この2行は同じ意味

var txt = "てきすと"

var (txt) = ("てきすと")

なので 変数名.0 でアクセスできる。


変数名.0

var txt = "てきすと"

println(txt.0) // -> てきすと
txt.0 = "テキスト"
println(txt) // -> テキスト

これ リテラル.0 もいけた。


リテラル.0

println("text".0)   // -> text

println((0).0) // -> 0
println(true.0) // -> true

そしてこれ


0の連鎖

var txt = "てきすと"

println(txt) // -> てきすと
println(txt.0) // -> てきすと
println(txt.0.0) // -> てきすと
println(txt.0.0.0) // -> てきすと
txt.0.0.0.0 = "テキスト"
println(txt) // -> テキスト

こえーよー

Swiftこえーよー


参考

Swiftスタートアップガイド