タプルとは?
タプル(Tuple
)は、複数の型のデータを一つにまとめて扱える構造です。
C#
では、タプルを簡単に作成でき、メソッドの戻り値として複数の値をまとめて返したい時や、
List
等で扱うデータをグループ化したい場合に便利です。
タプルの作成
以下の例では、名前と年齢の組み合わせをイメージしたタプルを作成しました。
クラスや構造体を定義しなくてもこのように書くことが出来ます。
private void Awake()
{
// 名前と年齢の組み合わせ
(string, int) userData = ("Mike", 19);
Debug.Log($"{userData.Item1} : {userData.Item2}");
}
以下の様に、メソッドの戻り値として使うことも出来ます。
private void Awake()
{
// 名前と年齢の組み合わせ
(string, int) userData = GetUserData();
Debug.Log($"{userData.Item1} : {userData.Item2}");
}
private (string, int) GetUserData()
{
return ("Mike", 19);
}
名前付きタプル
通常のタプルの場合、Item1
,Item2
で変数にアクセスします。
タプルを作成する際に名前も定義しておけば、名前でアクセスすることも出来ます。
private void Awake()
{
// 名前と年齢の組み合わせ
(string userName, int age) userData = GetUserData();
Debug.Log($"{userData.userName} : {userData.age}");
}
(string, int)
を(string userName, int age)
に変更しました。
userName
とage
でも変数を扱えるようになりました。
メソッドの戻り値に指定した名前と、受け取った側の名前が違う場合、
受け取った側の名前が使用されます。
private void Awake()
{
// 名前と年齢の組み合わせ
(string userName, int age) userData = GetUserData();
Debug.Log($"{userData.userName} : {userData.age}");
}
private (string name, int level) GetUserData()
{
return ("Mike", 19);
}
var
で受け取った場合は戻り値の名前が使えます。
private void Awake()
{
// 名前と年齢の組み合わせ
var userData = GetUserData();
Debug.Log($"{userData.name} : {userData.level}");
}
private (string name, int level) GetUserData()
{
return ("Mike", 19);
}
値を入れ替える
二つの変数の値を入れ替えたい!という場合、
通常もう一つ変数を用意して以下の様に書くと思います。
int a = 10;
int b = 100;
int temp = a;
a = b;
b = temp;
余談ですがC/C++
の頃はよく以下の様な書き方もしていました。
a^=b^=a^=b;
こういった場合もタプルを使うと簡単に書くことが出来ます。
int a = 10;
int b = 100;
(a, b) = (b, a);
// a = 100
// b = 10
まとめ
今回はタプルについて解説しました。
Unity
では、メソッドで複数の値を返したい場合がありますが、クラスや構造体を定義せずとも使えます。
便利な一方であまり多用するとコードが読みにくくなる可能性があります。
メソッド内まで、クラス内までといった制約を考えた方いいかもしれません。
機会があったら使ってみましょう。