さて,前回に引き続き,プログラミングの基礎について解説します。今回は,おもにObjective-Cについて説明します。
アクションのおさらい
いよいよObjective-Cに触れていきます。前回,次のようなアクションを書きました。
- (IBAction)myAction1:(id)sender {
int kakaku = [[motone text] intValue];
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;
}
[kekka setText:[NSString stringWithFormat:@"%d", kakaku]];
}
この中身,すなわち最初の { から最後の } までに書かれているものが,セグメンテッドコントロールで割引率が変更された際に実行されるアクションとなっています。
このアクションの中身を先頭から見ていきましょう。
値を取り出す
テキストフィールドに入力された値
まずは,ユーザが入力した金額の値を取り出します。パーツの持つ値はすべてアウトレットを通して受け取ります。ここではテキストフィールドが「motone」というアウトレットに接続されていますので,motoneを使ってテキストフィールドに打ち込まれた値を取り出すことができます。
int kakaku = [[motone text] intValue];
イコールより右側が,アウトレットを通してパーツに入力されている値を取り出すための命令です。イコールの左側にあるkakakuに金額が入ります。先頭についている「int」は,その後に続くkakakuが「整数である」ことを表しています。
セグメンテッドコントロールの値
次に,ユーザが選択した割引率を取り出します。セグメンテッドコントロールが接続されているアウトレット「waribiki」を通して取得します。
ここで取り出すことができるのは,セグメンテッドコントロールの「何番目のボタンが押されているか」です。何番目のボタンにどんな割引率が設定されているかはわかっていますので,もし一番左が選ばれているならば20%,あるいは左から2番目ならば30%…というふうに見ていくことになります。
何番目のボタンが押されているか,その番号をアウトレットを通じて取り出すには,次のように書きます。
[waribiki selectedSegmentIndex]
プログラム中でこれを記述した部分が,セグメンテッドコントロールで選ばれている番号に置き換わります。
ここで気をつけることは,プログラミングの世界で番号を数えるときは,特別な理由がない限り「0」からはじまるということです。号令をかけるときは「番号,1,2,3・・・」と数えるのが普通ですが,プログラミングの世界では最初の番号は0です。0,1,2,3…と続きます。ですから,セグメンテッドコントロールのボタンの番号も,一番左は「0番」です。その右が1番,その右が2番,そして一番右が3番です。
プログラムを扱う際このようなシチュエーションは多々ありますので,ここで慣れておきましょう。
Objective-Cの構文
2種類のパーツについて値の取り出し方を学びましたが,C言語に触れたことのある方はいずれもイコールより右側の書き方がObjective-C独特のものであることをおわかりいただけると思います。ここで,Objective-Cの書き方について触れておきましょう。
ここで行っているのは「テキストフィールドに入力された金額を取り出す」や「セグメンテッドコントロールで選択されたボタンの番号を取り出す」といった,Interface Builderで設置したパーツに対し,アウトレットを通して何らかの操作を行って情報を得る「メソッド呼び出し」といわれるものです。
メソッド呼び出しは [ ] でくくられた構文を使って行います。まずは「レシーバ」と呼ばれる,メソッド呼び出しの対象となるものを指定します。
Interface Builderで設置したパーツを対象とする場合は,そのパーツに接続したアウトレットがレシーバとなります。レシーバの後にスペースを入れ,続いて「メッセージ」と呼ばれるレシーバに動作させる内容を示した文を記述します。レシーバとメッセージの間に「の」を入れるとわかりやすいでしょう。実際にどんなメッセージが使えるかはレシーバによって異なります。この大括弧にくくられたレシーバとメッセージの組み合わせを「メッセージ式」と呼びます。
メッセージ式によって得られる結果もまたレシーバとなる場合があります。テキストフィールドに設定された値を取り出すメッセージ式では,まず「motone」に対して「text」を実行して取り出した「文字」に対し,さらに「intValue」というメッセージを使って「整数」として取り出すよう,最初のメッセージ式の結果をレシーバとしてさらにメッセージ式を作っています。このように入れ子になっているメッセージ式は,[ ] でくくられた単位で解釈していくと理解しやすいでしょう。


