SwiftにおけるTupleの使い方とわかりやすく解説します

19/03/03 17:11:19     19/04/08 09:57:24

Tupleの使い方

プログラミングには配列のようにデータをまとめて保持できる機能が複数用意されており、詳細はプログラミング言語によって異なります。

たとえば配列に似ているもので次に有名なものがあるとすれば、おそらくディクショナリーなどでしょう。

配列やディクショナリーに似た機能として、SwiftにはTupleという機能が用意されています。

Tupleの使い方

Tupleの使い方をサンプルコードで確認します。

let tuple = (1, 2, "3")
print(tuple.0) // 1
print(tuple.1) // 2
print(tuple.2) // 3

letで定数としてTupleを定義し、要素を指定して出力しています。イメージとしては、やはり配列に近い使い方になります。ラベル名を指定して宣言することも可能で、サンプルコードは以下です。

let tuple = (int: 1, str: "2")
print(tuple.int) // 1
print(tuple.str) // 2

イメージとしては、キーとバリューをセットで指定しているような形式です。実際にはキーとバリューという呼び方はせず、Tupleの場合要素番号を指定することもラベルを指定することもできます。以下の例では、ラベル付きのTupleに対して要素番号で指定しています。

let tuple = (int: 1, str: "2")
print(tuple.0) // 1

このコードではラベル名を指定していますが、出力時には要素番号で指定しています。このように、ラベルの有無に関わらず要素番号を指定することが可能です。また、ラベルありの要素となしの要素を混在させることも可能です。サンプルコートは以下です。

let tuple2 = (int1: 1, 2)
print(tuple2.int1) // 1
print(tuple2.1) // 2

要素の一つ目にはラベルを指定し、二つ目には値のみが入っています。そして出力時の指定方法としても、一つ目はラベル名で指定し、二つ目は要素番号で指定しています。重要な要素のみラベル名を付けるようなこともできるため、Tupleの利便性は配列やディクショナリーに比べて優れている点もあります。

ラベルはプロパティで取得できない

一部の要素にのみラベルを付けることで他の要素と差別化が図れると説明しました。これは重要な要素のみラベルで指定できるので利便性が高いのですが、残念ながらプロパティ一覧で取得できないという欠点があります。

目視すれば問題ないかもしれませんが、たとえば要素数が多いときにどのようなラベルがあるのか調べることができず、また指定したラベルが含まれているかどうか検索する方法もありません。

Tupleは一見すると配列やディクショナリーを上回る利便性がありますが、そこまで普及していないことにはそういった理由があるのかもしれません。また、メソッドもやはり配列ほど豊富に用意されているわけではありません。

dynamicTypeというプロパティが用意されていますが、これによってTupleの型を調べることができます。サンプルコードは以下です。

let tuple1: (Int, Int) = (1, 2)
let tuple2: (int1: Int, Int) = (int1: 1, int2: 2)
print(tuple1.dynamicType) // (Int, Int)
print(tuple2.dynamicType) // (Int, Int)

どちらもIntなので、たとえば対象のTupleにそもそもラベルを指定した要素が含まれているのかどうか知る方法も特にないようです。Mirrorでプロパティ一覧を調べてみます。

let tuple1: (Int, Int) = (1, 2)
let tuple2: (int1: Int, int2: Int) = (int1: 1, int2: 2)
print(Mirror(reflecting: tuple1).children.map { $0.label }) // [Optional(".0"), Optional(".1")]
print(Mirror(reflecting: tuple2).children.map { $0.label }) // [Optional(".0"), Optional(".1")]

Mirrorを使ってもプロパティ一覧のなかにラベルは含まれません。

Tupleでの代入処理

Tupleの代入は少し変わっており、ラベルありからラベルなし、ラベルなしからラベルあり、といった代入が可能です。サンプルコードは以下になります。

let tuple1: (Int, Int) = (int1: 1, int2: 2)
let tuple2: (int1: Int, int2: Int) = (1, 2)

ラベルなしにラベルありを代入するとラベルありとして代入されます。逆にラベルなしをラベルありに代入すると、ラベルありのままです。ただし、ラベルありからラベルありに代入する場合はラベルが同じである必要があります。

ラベルが異なる場合エラーになり、ラベルが上書きされることはありません。たとえば、エラーのサンプルコードは以下です。

let tuple: (int1: Int, int2: Int) = (int3: 1, int4: 2) // エラー

また厳密にはTupleのコードではないのですが、Tupleで宣言したものを複数同時に初期化することも可能です。たとえば、以下のようになります。

let (value0, value1) = (1, 2)
print(value0) // 1
print(value1) // 2

メソッドを用意して、戻り値をそのまま代入することもできます。

func method() -> (Int, Int) {
    return (1, 2)
}
let (value0, value1) = method()
print(value0)
print(value1)

あとは特殊な使い方として変数の値を入れ替えることができます。通常はいったん別の変数を用意して逃がしてから再度代入することになりますが、Tupleでは退避させずにそのまま入れ替えるコードが存在します。

var value0 = 0
var value1 = 1
(value0, value1) = (value1, value0)
print(value0) // 1
print(value1) // 0

このコードは値をそのまま直接入れ替えるものです。変数をひっくり返して書いてイコールでつなげれば入れ替わります。

まとめ

以上、Tupleの使い方について解説してきました。それほど難しい点はないかと思いますが、実際の開発でいざ使うとなるとどう扱えば良いかひらめきにくいかもしれません。というのも、配列やディクショナリーと比べると概念がややマイナーで、慣れない部分が多いかと思うからです。

Tupleはメソッドこそ少ないもののラベルを自由に扱える分利便性は高く、処理的に考えてTupleを使うのがベストな場合もあるでしょう。そしてもっとも難しいのは、Tupleを使用するタイミングを見極めることです。

アプリケーションによって詳細は異なるのでどのタイミングでTupleを使うべきか断言はできませんが、何も考えずに配列にしてしまうのではなく、Tupleが使えないかどうか一度検討してみることをおすすめします。

案件量が豊富なアルマサーチ

アルマサーチ

最後に、アルマサーチのご紹介!

アルマサーチはフリーランス向けに案件をご紹介することに特化したエージェントサービスです。豊富な案件量から、安定して継続的な案件のご紹介を実現しており、口コミから登録エンジニアが急増中です。

アルマサーチが選ばれる理由

  1. 豊富な案件量。週3〜4日の案件や在宅リモート案件も。
  2. 優秀なコンサルタント陣。
  3. 案件に参画後もしっかりサポート。

豊富な案件量

フリーランス向けに特化し、業界屈指の案件量を誇ります!週3〜4日の案件や、在宅リモート案件もありますし、その他あらゆる希望をしっかりお伝えください。最適な案件のご紹介をさせていただきます。

優秀なコンサルタント陣

技術に疎く、開発の希望を伝えても響かないエージェント・・・嫌ですよね。アルマサーチにはそのような者は一切おりません!さらに独立にまつわる税金や保険関係に詳しいスタッフが徹底的にサポートさせていただきます。

案件に参画後もしっかりサポート

常駐先が決まった瞬間に、一度も連絡が取れなくなるエージェント・・・いますよね?アルマサーチでは、そのようなことは一切ありません!常に電話やメールは即対応しますし、月に1度のランチミーティングなどから現場の状況を細かくヒアリングし、就業環境改善に尽力いたします。

相談する

▼Swift関連の記事一覧
1, 【Swiftのフリーランス案件情報付き】仕事やエンジニアの将来性・学習方法!
2, 繰り返し処理に使えるSwiftのfor文とfor-in文の便利な使い方まとめ
3, 条件分岐に便利なSwiftのSwitch文の使い方まとめ
4, アプリ開発でよく使うSwiftの4つの文法を解説します
5, Swiftのoptional型を使いこなすための7つのポイント
6, Swiftで文字列を扱うためのstring型の使い方
7, Swiftでの配列の宣言・初期化・代入・参照の方法まとめ
8, 実際の開発現場でのSwiftの変数・定数の使われ方を解説します
9, Swiftでif let文を使って出来ることとguard letの使い分けに関して
10, 開発現場でよく使うSwiftのif文の条件分岐をまとめました
11,(この記事)SwiftにおけるTupleの使い方とわかりやすく解説します
12, 初心者にオススメのSwiftのサンプルコードをまとめてみました
13, SwiftのString、Int、Doubleの型の変換方法をまとめました
14, 開発現場で役に立つSwiftのクロージャの使い方
15, Swiftでwhileを使って上手に繰り返し処理を行おう
16, Swiftで文字列の長さをチェックするのにlengthを使ってみよう
17, Swiftのdictionaryの使い方と初期化方法をまとめました
18, Swiftの値渡しと参照渡しに関するまとめ
19, Swiftで参照渡ししたい時のinoutの便利な使い方
20, Swiftでfor-in文でindexを使いたい時の方法まとめ
21, Swiftでのクラスとstruct(構造体)の使い分けを解説します

人気記事

編集部おすすめ記事

この記事を読んだ人はこんな記事を読んでいます

案件探しやフリーランスになるための相談する