[Swift] Tuple(タプル)の使い方

タプルって馴染みの無いかたには何ぞや?というものですが、ScalaやPythonなどで多用する超ベンリな値です。
一言で言うと
 複数の値を持った構造体
なんです。
え?そんだけ?なんですけど、
メソッドの戻り値などで使うと今までシコシコ専用のResultクラスを作ったり、みっともなく配列で返したりしてたのがスッキリ解決!

宣言方法

// Tupleはジェネリック型なので下記の宣言だと <String,String,Int> なタプルとなります。
let tupleValue = ("お前の","カーチャン",67)

 
 
この要素へのアクセス方法いろいろ

// tupleの要素を取得する方法で簡単なのはインデックスを指定することだと思う
NSLog("\(tupleValue.0)\(tupleValue.1)\(tupleValue.2)才!!")
//・・ お前のカーチャン67才!!


// まとめて変数に取り出すこともできる
let (word1,word2,age) = tupleValue
NSLog("\(word1)\(word2)\(age)才ですか?")
//・・ お前のカーチャン67才ですか?


// 同様の書き方で必要な項目だけ取り出す場合
let (_,_,motherage) = tupleValue
NSLog("かーちゃん\(motherage)才")

 

SwiftのTupleは要素に名前を付ける事ができるんです。
わかりやすくなりますね。

// Swiftのtupleには要素に名前をつけることができる!
let comic = (title:"にんにくマン",volume:1)

// その場合、名前で参照することができて便利!
NSLog("漫画(A):%@ vol.%d",comic.title,comic.volume)
//・・ 漫画(A):にんにくマン vol.1


// もちろん普通に取り出すことも可能
NSLog("漫画(B):%@ vol.%d",comic.0,comic.1)

 

応用編としてswitchで条件分岐

//switchでの使い方
let gokuu = (name:"悟空",taillength:97)
let vegita = (name:"ベジータ",taillength:105)
let frieza = (name:"フリーザ",taillength:0)

for fighter in [gokuu,vegita,frieza] {
	// 尻尾の長さで判定
    switch fighter {
    case (let name,0):
        NSLog("\(name)、あなたはサイヤ人ではありませんね。。。")
    case (let name,let taillen) where taillen > 100:
        NSLog("\(name)、あなたはサイヤ人の王族ですね!!")
    case (let name,let taillen):
        NSLog("\(name)、あなたは普通のサイヤ人ですね?")
    }
}

 
簡単な複合値であればわざわざクラスを作る必要が無くなってコーディングスピードUP間違い無しです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です