LoginSignup
86
68

More than 5 years have passed since last update.

SwiftのTupleを使う

Last updated at Posted at 2014-11-20

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スタートアップガイド

86
68
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
86
68