今日は初めてObjective-Cのクラスを自前で作成してみたのでメモだ。‥ええっと環境はMacOSX SnowLeopard10.6.4、XCode3.2.4です。
空のプロジェクトに新規ターゲットで、Shellを選択し、Foundation.Frameworkを追加し、なおかつ、main.mを追加したところでそれを拡張子mmに改名したものに、以下ソースを記述してビルド&実行します。
Foundation.Framework追加しないとただのC/C++コードと戯れることができますが、追加することにより、Objective-Cを使えるようになる、そのためにやっている、という認識です。
#import <Foundation/Foundation.h> // いきなりC++コードとの共存を実現 // 拡張子をmでなく、mmにしないと以下でおこられる。 #include <iostream> #include <string> #include <vector> using namespace std; // // クラス「Hi」 // インタフェースの定義 @interface Hi: NSObject -(void)SayYeah; -(void)SayYo:(string)yo; -(void)SayYo:(string)yo Ya:(string)ya; @end // クラス「Hi」 // 実装の定義 @implementation Hi - (void)SayYeah { cout <<"Yeah!" <<endl; return; } - (void)SayYo:(string)yo { cout <<yo <<endl; return; } - (void)SayYo:(string)yo Ya:(string)ya { cout <<yo <<ya <<endl; return; } @end // 以上のクラスの使用事例 int main( void ) { id hi = [Hi alloc]; [ hi SayYeah ]; [ hi SayYo:"yoo" ]; [ hi SayYo:"yoo" Ya:"yaa" ]; return 0; }
そして以下が実行結果だ。(これはコンソールアプリなので、XCodeの画面上にあるメニュー>実行>コンソールをクリックし、デバッグコンソールを実行前に予め出しておいたらいいだろう。)
run [Switching to process 1415] 実行中... Yeah! yoo yooyaa Debugger stopped. Program exited with status value:0.
自分なりに押さえたいポイントを挙げておくぞ。
- というわけでObjective-Cの実験環境の作り方、C++コードとの共存、クラスの定義(インタフェース定義と実装の定義)と使い方(インスタンス作成とメソッド呼び出し)といった一通りのことがわけわかるようになったかも知れません。
- @interface ClassName〜@end, @implementation ClassName〜@endという具合に、インタフェース部と実装部は分けて記述しなくてはならない。だからこのことだけで、クラス名は少なくとも2回書かなくてはならない。
- 複数引数を受け取るメソッドではラベルというものを指定する。複数引数メソッドの定義では、(引数型)引数名という組み合わせを基本的にはコロン:で繋げて記述していくわけだが、このコロンの前に、スペースを入れ、ラベル名というものを入れることができる。何が便利なのかはいまいちまだよくわからん。
- #includeの<>の中には、よけいなスペースを入れるとコンパイルエラーとなる。(gccがそうなのかも)
- Obj-C特有の記述方法が満載だが、行末のセミコロンが必要なお約束はC/C++と同じ。
- @interfaceの中の定義には、意外と中括弧の出番はない。(@endで閉じるイメージ)