Objective-Cでのメソッドとメッセージ.
メソッドの書き方
前回、Objective-Cにおけるクラスの作り方を書きました。今回は実際の処理の部分に当たるメソッドの書き方です。
まず、メソッドは実装部に記述します。
#import "MySampleClass.h" @implementation MySampleClass -(void) sayHello { /*プログラムの中身*/ } @end
これが一番シンプルなメソッドの書き方です。”-(void)”で「void型のインスタンスメソッドである」ということを定義し、”sayHello”がメソッド名になります。
プログラムによっては”-(void)”の”-”の部分が”+”になっているものがあります(+(id)… など)。これらはクラスメソッドと呼ばれるものです。インスタンスメソッドとクラスメソッドの違いについては後述します。
とにかく後はsayHelloメソッドの中身を書けばいいわけです。
「hello」とコンソールに出力するメソッドを作りましょう。
#import "MySampleClass.h" @implementation MySampleClass -(void) sampleMethod { NSLog(@"hello"); } @end
これで、このメソッドが呼ばれた時にhelloと出力されます。
では、このメソッドを呼ぶにはどうすればいいのでしょうか。
メッセージについて
メソッドを呼び出すプロセスをObjective-Cでは「メッセージを送る」と言います。あるオブジェクトが持っているメソッドを実行するときに「あなたのそのメソッドを実行して!」というメッセージを送っていると考えればしっくり来るかと思います。
呼び出す際は次のように書きます。呼び出したいメソッドが書かれているオブジェクト名をまず記述し、その後に目的のメソッド名を書きます。そしてそれを「[ ]」で囲います。
” [ オブジェクト名 メソッド名]; ”
実際のプログラムを見てみましょう。今、メイン関数でMySampleClassクラスのHumanというオブジェクトに、先ほどのsayHelloメソッドを実行させたいとします。するとMain.mはこのようになります。
#import "MySampleClass.h" int main(void) { MySampleClass* Human; /*メモリ確保とイニシャライズは省略*/ [Human sayHello]; return 0; }
これでメイン関数はオブジェクトHumanが持っている機能のsayHelloを呼び出し、実行させ、コンソールに’hello’と出力させることができます。
引数を持つメソッド
では、メソッドに何らかのデータを渡したいときはどのように書くのでしょうか。このような場合にはメソッド名の後にコロン「:」をつけ、データ型を指定し、メソッド内で使われる引数名を指定します。
「 -(返り値の型) メソッド名: (引数の型)引数名 」
例えば先ほどのsayHelloメソッドの「hello」と言う回数を引数で指定すると仮定すると以下の様な書き方ができます。
-(void) sayHello:(int)num { for(int i = 0; i < num; i++) { NSLog(@"hello"); } }
引数が2個以上になる場合は、第一引数の後にスペースを入れた後、キーワードと共に引数を指定します。
「 -(返り値の型) メソッド名: (第1引数の型)第1引数名 キーワード:(第2引数の型)第2引数名 」
キーワードは省略可能ですが、プログラムをわかりやすくするため付けておくことを推奨します。
今度はsayHelloを名前データも取得し、「hello 〇〇」と出力するように変更してみます。
-(void) sayHello:(int)num name:(NSString*)s { for(int i = 0; i < num; i++) { NSLog(@"hello %@.", s); } }
”name”が第2引数のキーワードで、文字型オブジェクトsを受け取ります。NSStringに”*”が付いているのは、オブジェクトのポインタを渡しているためです。オブジェクトを参照したり代入する際はポインタを渡すと覚えておけば大丈夫です。
NSLog内の”%@”はオブジェクト型の変換仕様で、sの文字列オブジェクトを出力します。
キーワードを省略する場合は
-(void) sayHello:(int)num : (NSString*)s
になります。「:」は省略できません。
ここで先程のように、このメソッドにメッセージを送ってみましょう。
NSString* Name = @"Jimmy"; int count = 3; [Human sayHello:count name:Name];
まずメッセージを送る前にNameという文字列オブジェクトを作成し、その文字列をJimmyにしておきます。また回数をcountに入れておきます。
これらを4行目でsayHelloメソッドの引数として送ってやることで、sayHello内でこれらのデータを使うことができます。
これを実行すると「hello Jimmy.」が3回出力されます。
Objective-Cではこのような方法で他クラスのメソッドを呼び出し、実行することができるのです。
しかし、他クラスでメソッドを実行する際に知っておかなければならないことがもう一つあります。それが「メソッドの可視性」です。
次回はメソッドとインスタンス変数の可視性について解説したいと思います。