目指せ!iPhoneアプリ開発エキスパート

第5回 アクションとObjective-C

この記事を読むのに必要な時間:およそ 3.5 分

計算と結果の表示

switch文による条件分岐

次は割引後の値段の計算です。⁠kakaku」に入っている金額と割引率を使って計算しますが,割引率はセグメンテッドコントロールで選ばれているボタンの番号によって,あらかじめ決められた割引率から選択する必要があります。0番ならば20%,1番ならば30%,2番ならば40%,そして3番ならば50%となります。割合を小数で表し,1から引いたものを kakaku にかけて割引後の金額を求めます。たとえば,0番が選ばれている場合,すなわち割引率が20%の場合は次のような式になります。

kakaku = kakaku * (1.f - 0.2f);

小数の後ろについている「f」「float」の頭文字で,その数字が小数であることを示すためのものです。プログラムは,同じ数字でもそれが整数なのか小数なのかをはっきりと区別する場合があります。最初のうちは,結果が小数となる計算で扱う数字に「f」をつけておくという感覚でかまわないでしょう。整数を小数として扱う場合は,⁠1f」ではなく「1.f」のように小数点を加えて表現します。

複数の割引率を扱うために,switch文を用いて分岐をします。switch文はある条件に基づいていくつかの異なる処理をさせるためのプログラム文です。switchに続く ( ) 内に処理を分岐させるための条件を,続いて { } の中に実際の分岐と処理内容を記述します。

switch([waribiki selectedSegmentIndex]){
case 0:
    kakaku = kakaku * (1.f - 0.2f);
    break;
case 1:
    kakaku = kakaku * (1.f - 0.3f);
    break;
case 2:
    kakaku = kakaku * (1.f - 0.4f);
    break;
case 3:
    kakaku = kakaku * (1.f - 0.5f);
    break;
default:
    break;
}

ここでは,caseに続く数字がセグメンテッドコントロールの番号と一致した場合,その後の「:」⁠コロン)に続いて書かれているプログラムを「break;」まで実行します。最後の「default:」はどの条件にもあてはまらない場合の処理で,今回のように起こりえるすべての条件が書かれている場合には無くても問題ありません。見てわかるとおり実際に「default:」の条件の中ではすぐに「break;」が書かれており,何の処理も行っていません。

これで「kakaku」に割引後の金額が入りました。⁠kakaku」は整数なので,金額として表示する際にはそのまま扱うことができます。

画面への表示

「kakaku」の値を画面に表示してみましょう。ラベルにこの値を設定することで表示します。ラベルと接続しているアウトレットは「kekka」です。

[kekka setText:[NSString stringWithFormat:@"%d", kakaku]];

値の受け取りと同様にアウトレットをレシーバとするメッセージ式を使って書きますが,今回は値の設定ですので,実際に設定する値をメッセージ式の中に含める必要があります。そこで登場するのが,引数です。

引数を含むメッセージ式

引数を含むメッセージ式

引数は,レシーバに何らかの値を渡すための仕組みです。メッセージにある「:」⁠コロン)より後の部分が引数です。一方「:」より前の部分,すなわち「setText」「メソッド」と呼びます。このように,何らかの値をレシーバに渡す必要があるメッセージは,メソッドと引数の組み合わせで成り立っています。ここでは,ラベルが接続されているアウトレット「kekka」に対して「setText」メソッドで設定する文字を引数として指定しています。

この「setText」メソッドの引数として指定できるのは,数字ではなく文字(正しくは文字列)だけです。ここに数字を指定したい場合,数字をいったん文字列に変換してから指定する必要があります。そこで「NSString」というものを使って文字列を組み立てます。

「NSString」は文字列に関するいろいろな操作を行うためのもので,これをレシーバとしてメッセージ式を書くことで機能します。ここでは「stringWithFormat」で文字列の中身を整形することを指定し,引数としてその整形の方法を指示するためのルールと,文字に変換したい値「kekka」を渡しています。こうすることで「NSString」をレシーバに指定した [ ] の部分が文字列に置き換わり,⁠setText」の引数として指定できるようになるのです。値の受け取りで書いた時と同様に,メッセージ式を入れ子にして書くことができます。

こうしてアウトレット「kekka」を通して設定した文字列が,⁠kekka」に接続された画面上のラベルに表示されるという仕組みです。

難しい話はあとまわし

「オブジェクト指向プログラミング」という言葉をご存知でしょうか。本来はプログラムを書く効率をあげたり,複雑なプログラムをより確実に動かすことを目的とした,いわばプログラミングのテクニックのようなものです。ところが,今や書店にはオブジェクト指向プログラミングの専門コーナーが設けられるほどさまざまな本が並び,なんだか難しそうだ,概念を理解するだけでも大変そうだ,なんてイメージを持たれている方もいらっしゃることでしょう。iPhoneアプリの開発でも,このオブジェクト指向プログラミングは避けては通れない道になっています。

オブジェクト指向プログラミングは,それを自分のものにしてしまわない限り,とても敷居が高く感じられるものです。そしてそれを自分のものにするためには,多くの時間を費やすことになってしまうかもしれません。そんなことではせっかく思いついた素晴らしいアイデアも,時間とともに台無しになってしまいます。

しかし,ここまでのプログラミング作業において,オブジェクト指向プログラミングを意識することはほとんどありませんでした。Interface Builderでパーツを配置し,アウトレットと接続して,アウトレットを使ってメッセージ式を作るという,とても直感的でわかりやすい作業のみでアプリを動かすことができました。

クラスとインスタンスの関係

クラスとインスタンスの関係

クラスを設計しインスタンスを生成するという作業は,無意識のうちにすべてInterface Builder上で行っています。Interface Builderを積極的に使ったアプリ開発では,まずパーツを配置して画面を構成し,そこからクラスファイルを生成する手法をとっています。iPhoneアプリのような小規模な開発では,この手法はオブジェクト指向プログラミングの良いところを活かしつつ難しいところは後回しにできるため,たいへん効率の良いものとなっています。

Cocoa Touchを使ったiPhoneアプリの開発では,すでにオブジェクト指向プログラミングを理解している方もそうでない方も同じスタート地点に立つことができます。Cocoa Touchを実際に使うことは,オブジェクト指向プログラミングを実践していることと同じ。学ぶより先に使ってしまいましょう。難しいことは,アプリが動いた後でじっくり学べば良いのです。その頃にはプログラミングに対してさらに興味が沸いてくることでしょう。

公開するためのアプリ作り

次回からは実際にApp Storeで公開することを目指し,アプリの見栄えを調整するテクニックや,Cocoa Touch で提供されているより多くのパーツの使い方を学んでいきます。さらにはアプリを実際にiPhoneで動作させるための方法,App Storeで公開するための手続きなどについても説明していきます。これまでに学んだInterface Builderの使い方と,アウトレットおよびアクションの設定をしっかりと復習しておきましょう。

著者プロフィール

皮(かわ)

1980年宮崎県生まれ。納豆好き。

アイフォーンの皮:http://mixi.jp/view_community.pl?id=3531790