コンパイラディレクティブ

 iPhone開発はObject-Cを使っているんですが、XcodeやInterfaceBuilderなる大変便利な開発ソフトがすでに存在しているので何となく簡単なソフトできちゃうんですが、これは完全にカチカチのオブジェクト指向プログラミングであることに気がついてちょっと驚きました。ややしばらくWebコードをPHPとかで書いていたのでこれぐらいコテコテになってくるとお祓いをしてから仕事をはじめた方がいいんじゃないか...と思われるほど寒気がしました。
 XcodeのClassesフォルダー内に入っている2つのクラスファイル(.mと.h)の.hの方。これはいわゆるオブジェクトCでいうところのコンパイラディレクティブでありまして、クラスの宣言をしているところでした。iPhoneアプリの初心者解説では「ヘッダ」とか言っていますが、概念的には全然違いますね。確かにコードの最初の方で宣言するのでヘッダはヘッダですが...。

クラスの宣言

 クラスは変数や関数がかぶらない(重複しない)ようにするためのかなり賢いデザインであります。こういうクラスを幾重にも重ねても変数が被らない。つまりクラスは名前空間(おかしな日本語だ)の中で賢く動いてくれて中でしっかりと働いてくれて自由に外を歩き回ったりしません。そんなわけである限定された空間の中で変数と関数の振る舞いをしてくれます。ある意味でその空間を囲ってしまってその中で処理を収めるという役目をしています。レイヤーとかいう概念と近いかもです。
 そのクラスの宣言を行うのがコンパイラディレクティブと呼ばれるもので、Object-Cでは拡張されたまたは実装されたクラスの宣言をするコンパイラディレクティブはすべて@マークで始まるということになっています。そして、クラスの宣言は、@interfaceではじまり@endで終わります。覚えておいて損はなし。
構造はこんな感じ
@interface クラス名 : 親クラス名
{
    インスタンス変数宣言
}
メソッド宣言
@end
実際はこんな感じ
@interface testclockViewController : UIViewController {←クラス名
    IBOutlet id result; ←変数の宣言です。
    IBOutlet id input;
    IBOutlet id calculate;
}
- (IBAction)Action1:(id)sender; ←Actionと言っているのはメソッドのことでした。
@end

メソッドの宣言

 上記にもうすでに書いてしまいましたが、クラスを宣言するコンパイラディレクティブではメソッドの宣言もします。宣言をやらないと定義の意味が全くないわけでして。
 メソッドの宣言はちょっと風変わりな方法を取ります。
- (戻り値型) メソッド名 : 仮引数リスト ... ;
なんじゃこりゃ。
 実物を見ると
- (IBAction)Action1:(id) sender;
となっているので、(IBAction)が戻り値型で、(id) senderが引数ということになります。(id)なのでid型の変数を引数にAction1というメソッドに与えていることになります。何らかの計算なり処理などが行われた後に(IBAction)という型に戻り値を渡してやるという感じでしょうか。Object-Cの型は()で囲むことになっているようです。しかしこの戻り値の型なんですが、型と言えば整数、浮動小数点、理論型、バリアント型...とかいろいろありますが、Object-Cではこれまた奇妙な型を持っていてid型というものをデフォルトで使います。(何それ!)私も意味がわかりません。id型にしろというんだからid型で戻せばいいという感じで。戻り値がいらない場合は、(viod)と定義しておくこと。
 引数も同様で()内に変数型を書きます。
 - 記号から始まるという書き方には違和感を覚えるかもしれませんが、- はインスタンスメソッド、+ はクラスメソッドと覚えておけば大丈夫(だと思う)。
 しかし感覚からして、(id)sender;ではなくて、sender(id)の方が感じがいいですよ。

メソッドの定義

 クラスの宣言をしたら必ずやらなくてはならないのは、メソッドの定義(要するに簡単にいうとユーザー定義関数)を書かなくてはいけません。これはいつもセットです。このメソッド定義がiPhoneアプリ開発ではクラスファイルの中のソースファイルと呼ばれている.mで終わるファイルなんですね。
 メソッドの定義は、@implementationではじまり@endで終了です。
構造はこんな感じ
@implementation クラス名
メソッド定義
...
@end
実際はこんな感じ
@implementation testclockViewController ←クラス名
- (IBAction)myAction1:(id)sender { ←メソッドの定義ここから
    int value = [[input text] intValue];   
    switch([calculate selectedSegmentIndex]){
        case 0:
            value = value * (1.f - 0.2f);
            break;
        case 1:
            value = value * (1.f - 0.3f);
            break;
        case 2:
            value = value * (1.f - 0.4f);
            break;
        case 3:
            value = value * (1.f - 0.5f);
            break;
        default:
            break;
    }
    [result setText:[NSString stringWithFormat:@"%d", value]];
}
@end

まとめ

 大まかな構造からいうと初心者iPhone開発虎の巻にあるようにヘッダとボディーみたいな関係にあって、
  • クラスの宣言
    • インスタンス変数の宣言
    • メソッドの宣言
  • メソッドの定義
という二つの組からなっています。Xcodeではこれらのファイルを二つに分けていますが、たぶん一つにすることもできるんだろうな...と。(見づらいです。2つに分かれていると。)







プロフィール



  • Name :: 山上オサム ♂(37)
  • Hobby :: 武術
  • Work :: Web Designer