2014年6月11日水曜日

Swiftカンフー #001 関数から複数の値が戻ってきたときの処理

もうじきiOSの本を出版するので、Swiftは避けて通ることができません。

というか、なかなか悪くない言語かなと思っています。

GoogleのDartも悪くないと思ったのですが、やっぱりそう簡単には広まりません。だいいち実行速度が遅すぎるし...。 しかしAppleがiOSやMac用に採用したとなると、強制的に広まることになります。

というわけで、Swiftのお勉強を始めることにしました。

関数は複数の値を返せる

Swiftの関数は複数の値を返せます。たとえば次のように定義します。

func ガソリンスタンドの価格表() ->(灯油: Int, レギュラー: Int, ハイオク: Int) {
  return (114, 152, 168)
}

しかし、日本語が変数名や関数名に使えるというのはメチャわかりやすいですね。ふ〜む。変数とテキストの区別がつかなくなるかと心配していたのですが、それは杞憂のような気もします。もっとも、英語ネイティブな人々はいつもこんな風に書いているわけですからね。かえって、funcとかIntとかreturnとか、キーワードが目立ってわかりやすいかもしれませんね。

複数の値をもらうには?

関数から複数の値が返ってくるのは、はっきり言って便利です。 ポインタとか使わなくていいですし、明確です。 JavaScriptでもオブジェクトを返せば複数の値を簡単に返せますが、私はすぐに気がつかなかったです。それに対して、こう明確になっていると明確。もっともPHPは返せましたよね(色々やっていると混乱する...)。

さて、「返ってきた複数の値をどう処理したらいいんだろう?」と思ったら、タプル(tuple)というのを使えばいいのです。あえて訳せば「n組」「n個の組」とでも言いましょうか。Wikipediaを見ると「組」という訳も使われているみたいですね。

じつは関数定義の次の部分は「タプルを返しますよ」という宣言なのでした。この場合は「三つ組み」を返しますということですね。

 ->(灯油: Int, レギュラー: Int, ハイオク: Int) 

それで、受け取る側は次のようにタプルで受け取ればいい。

func ガソリンスタンドの価格表() ->(灯油: Int, レギュラー: Int, ハイオク: Int) {
  return (114, 152, 168)
}

let (灯油, レギュラー, ハイオク) = ガソリンスタンドの価格表()  ## ★★ここ★★ letは定数の定義

println("本日の価格(税込) -- 灯油:\(灯油)円 レギュラー:\(レギュラー)円  ハイオク:\(ハイオク)円");

実行結果はこちら。

% swift -i example-01-func-multi-value1.swift ## ← -iでファイルを指定できる
本日の価格(税込) -- 灯油:114円 レギュラー:152円  ハイオク:168円

% swift  example-01-func-multi-value1.swift ## ←オプションを指定しないと実行ファイルを作る

% ./example-01-func-multi-value1   ## これで実行できちゃう
本日の価格(税込) -- 灯油:114円 レギュラー:152円  ハイオク:168円
  • let —— 定数の定義
  • println —— 1行出力。「\(<変数>)」で変数の値を入れられる。ライブラリとかインクルードしなくても使える。

なお、タプルをひとつの変数に代入することもできるようです。最後に、全部まとめてソースを書いておきましょう。

/* ファイル名: example-01-func-multi-value1.swfit */

// 関数の定義
func ガソリンスタンドの価格表() ->(灯油: Int, レギュラー: Int, ハイオク: Int) {
  return (114, 152, 168)
}

let (灯油, レギュラー, ハイオク) = ガソリンスタンドの価格表() // タプルで受け取る
println("本日の価格(税込) -- 灯油:\(灯油)円 レギュラー:\(レギュラー)円  ハイオク:\(ハイオク)円");

let 価格表 = ガソリンスタンドの価格表() // こうすることもできる
println("本日の価格(税込) -- 灯油:\(価格表.灯油)円 レギュラー:\(価格表.レギュラー)円  ハイオク:\(価格表.ハイオク)円");

0 件のコメント: