【Swift】戻り値が複数の関数を作るにはタプルを利用する(Swift 2.1、XCode 7.2)
戻り値が複数ある関数を定義する
C言語やJavaを使ったことのある人は、関数を呼び出したときの戻り値は1個だけというイメージがある。複数の値を戻す必要がある場合は、ポインタを利用したり、クラスインスタンスにデータを詰めてインスタンスの参照を返すといった方法をとってきた。しかし、Swiftではで戻り値が複数の関数を定義できる。
戻り値が複数の関数は以下のように定義する。
1 2 3 4 5 |
//戻り値が複数ある関数の定義 func 関数名(引数名:型) -> (戻り値の型, 戻り値の型, ...) { 処理 return (戻り値, 戻り値, ...) } |
戻り値が複数ある関数の使用例
以下のコードは、商品の価格と個数を与えると税抜価格と税込価格を返す関数。戻り値は2つの値が格納されたタプルで返ってくる。例では、「let(変数, 変数)」と定義して2つの変数に直接タプルに格納されている値を代入している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
/* * 戻り値が複数の関数 */ //商品の税抜価格と税込価格を戻す関数 func calcTotal(price:Int, number:Int) -> (Int,Int){ let total_no_tax = Double(price) * Double(number) //税抜価格 let total_in_tax = Double(price) * Double(number) * 1.08 //税込価格 return (Int(total_no_tax), Int(total_in_tax)) } //200円の商品を3個購入したときの価格を調べる let (test1, test2) = calcTotal(200, number:3) print("税抜価格は\(test1)") print("税込価格は\(test2)") //実行結果 //税抜価格は600 //税込価格は648 |
以下のコードのように、タプルの戻り値をタプルの変数に代入してインデックス番号で値を参照する方法もある。
1 2 3 4 5 6 7 8 9 10 |
//200円の商品を3個購入したときの価格を調べる var total = calcTotal(200, number:3) print("税抜価格は\(total.0)") print("税込価格は\(total.1)") //実行結果 //税抜価格は600 //税込価格は648 |
タプルに格納されて返されるデータはIntやStringなどの基本データ型に限らない。
以下のコードは、関数が2つの配列を返す関数の例である。関数を呼び出した側は、戻り値をタプルの変数に代入し、インデックス番号で配列を取得している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/* * 2つの配列を返す関数 */ //参加メンバーが格納された2つの配列を返す関数 func getEntryMember() -> (Array<String>, Array<String>){ let man = ["山田","田中","佐藤"] let woman = ["篠崎", "杉田", "大森"] return (man, woman) } // var member = getEntryMember() //男性の参加者を表示 for a in member.0 { print(a) } //女性の参加者を表示 for b in member.1 { print(b) } //実行結果 //山田 //田中 //佐藤 //篠崎 //杉田 //大森 |
もちろん、クラスや構造体も複数の戻り値の中に含めることができる。
以下のコードは、商品情報の構造体を引数に受け取り、税込価格に変更した商品情報と税率を返す関数の例。
ちなみに、構造体は値型なので、関数に渡った時点で構造体のコピーが作られる。そのため、関数に引き渡すために作った商品情報(before_shouhin)と関数から戻ってきた商品情報(after.0)の価格は別の値になる。構造体については次の記事も参照されたし。⇒「記事」
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/* * 関数の引数と戻り値に構造体を使う例 */ //商品情報の構造体 struct Shouhin{ var price:Int = 600 var size:String = "M" var color = "blue" } //商品情報の価格を税込価格に変更し、商品情報と税率を返す関数 func changePrice(var sho:Shouhin) -> (Shouhin, Double){ let tax = 1.08 sho.price = Int(Double(sho.price) * tax) return (sho, tax) } //商品情報を作成 var before_shouhin = Shouhin() //商品情報を引数に関数を呼び出す。 var after = changePrice(before_shouhin) print("変更前 \(before_shouhin.price)円") print("変更後 \(after.0.price)円") print("税率 \(after.1)") //実行結果 //変更前 600円 //変更後 648円 //税率 1.08 |