ASCII倶楽部

このページの本文へ

Swift Playgroundsで学ぶiOSプログラミング 第13回

コマンドの後ろの()って何?

自分専用のコマンドを作るファンクション

2016年11月07日 17時00分更新

文● 柴田文彦 編集●吉田ヒロ

  • この記事をはてなブックマークに追加
  • 本文印刷

 iPad版のSwift Playgroundsで利用できる「Learn to Code」はもう試されたでしょうか。その最初のチャプターのタイトルは「Commands」、つまり「コマンド(命令)」です。Swift言語には、厳密に言うと「コマンド」という概念はありません。これは専門用語を避け、一般的な「命令」という語を使って、出だしを親しみやすくするための措置でしょう。具体的には「moveForward()」や「collectGem()」というコマンドを組み合わせて問題を解決するものでした。

 これらのコマンドは名前の後ろに「()」という記号が付いていました。それは何なのか、なぜそんなものが必要なのか、という疑問を感じる人が多かったのではないかと思います。この「()」は、そのコマンドがSwiftの「ファンクションの呼び出し」であることを表しています。つまりファンクションの呼び出しによって、コマンドを実行していたのです。言い換えれば、どこか見えないところにある複雑なプログラムによって実現されている機能に名前を付け、その名前を書くだけでその機能が使えるようにしたものだったのです。と言っても、疑問が増えるだけかもしれません。今回は、そのファンクションの正体に迫ります。

ファンクションを作る

 まずはファンクションとは関係なく、変数を使った簡単な計算式を入力してみましょう。「result」「val1」「val2」という3つの変数を用意し、val1とval2の値を足し算した結果をresultに代入するという単純なものです。

3つの変数の定義、それらを使った計算式、その計算結果の表示というプログラムを打ち込んで結果を確認しています

 その後、その計算結果のresultをprint()ファンクションを使って表示しています。Xcode版のPlaygroundでは、print()を使った結果は、コンソールと呼ばれる別の領域に表示されるのですが、iPad版にはそうした領域がありません。その代わり、画面の右端に表示されるボタンをタップすると、結果が吹き出し状に表示されます。前回までは、print()は使わず、数式を書いた行の右端に表示されるボタンをタップして、その式の値を表示していました。

 print()を使っても使わなくても結果は大差ないので、print()の意味がないと思われるでしょう。そのとおりかもしれませんが、ここではプログラムの1つの区切りという意味でprint()を使うことにします。

 よく見ると、print()の右端に表示される小さなボタンのアイコンがほかとは違っていることに気づくでしょう。単なる式の行は数値を表す「123」というボタンだったのに対し、print()の行の右端は「abc」というボタンになっています。これは、この結果が文字列であることを表しています。print()は数値を文字列として表示していることになります。もちろんこれは今回の本題ではないので、特に気にする必要はありません。

 さて、ここで今回のテーマのファンクションを導入しましょう。まずは、画面右上の「+」ボタンをタップして開くメニューか、画面の底辺のツールバーから「func」を選んで、ファンクションのテンプレートを入力しましょう。場所は計算式とprint()の行の間とします。

ファンクションを定義するためのテンプレートを、「+」メニュー、またはツールバーから「func」を選ぶことで入力しました

 テンプレートを使って入力したばかりのファンクションは、以下のようなかたちをしています。

func [name]() {
 [function body]
}

 この「func」で始まるのは、ファンクションを定義する部分です。つまりほかから呼び出してもらう機能をプログラムする部分です。最初に赤くハイライトされている[name]には、そのファンクションの名前を入力します。その名前によって呼び出してもらうことになります。そして[function body]の部分には、そのファンクションで実現する機能のプログラムを書きます。

 このファンクションの名前は、「計算」を表す「calc」とします。ほかの好きな名前でもかまいません。[name]の部分をタップするとキーボードが表示されるので、入力してください。そして[function body]の部分は、新たに入力するのではなく、すでに入力した計算式を取り込むことにします。前回のforループの枠を動かして中身を取り込んだのと同じ要領で、「func」または「}」の部分を上下にドラッグして、その上にある「result = ...」という式を「func」と「}」の間に取り込みます。

ファンクションの名前を「calc」とし、元からあった式を取り込んで、その中身としました

 これで、どうやらファンクションらしいものができました。とりあえずここでプログラムを実行してみます。最後の「print(result)」の値を確認すると「0」になっています。これは最初の行で「result」を初期化したときの値のままです。つまり「func〜}」で囲った部分は実行されていないのです。

 それもそのはず、ファンクションは、そこにあるだけでは実行されません。実行するにはそれを呼び出す必要があります。

カテゴリートップへ

この連載の記事

週間ランキングTOP5

ASCII倶楽部会員によく見られてる記事はコレだ!

ASCII倶楽部の新着記事

会員専用動画の紹介も!