itsukichang

フロントエンドが得意なエンジニア.ダーツと旅行とギターが好き

メソッドの宣言。

文法から書きますと、


インスタンスメソッドの場合

 - (返り値型)メソッド名;
 - (返り値型)メソッド名:(引数型)引数名;

クラスメソッド

 + (返り値型)メソッド名;
 + (返り血型)メソッド名:(引数型)引数名;

何やら-とか+とかコロンとか色々複雑そうですが、宣言の並びはC++と同じです。
返り値型、メソッド名、引数型、引数名という順序は。

インスタンスメソッドとクラスメソッドの違いは、マイナス記号で始まるかプラス記号で始まるか。この一点だけです。
インスタンスメソッドが-(マイナス)、クラスメソッドが+(プラス) です。
覚え違いのないように。


さて、上記の文法は上から 引数がない場合と引数が1つの場合です。
では2つ以上ある場合はどうするか、以下の通りになります。

例:引数が二つの場合。

 -(返り値型)メソッド名:(引数型)引数名 <span style="color:#CC0000;">ラベル</span>:(引数型)引数名; 

一つ目までは、前と同じです。そしてその後ろにまず、空白。そして、ラベル。その後にコロン、括弧して引数型、引数名。
ここで、メソッド名の代わりにラベルというものができました。
これは後に続く引数を説明するものです。
ラベルはメソッド名の一部ということになります。OCではメソッドの正式な名前は、メソッド名とラベルを合わせた物になります。

例えば、

 -(void)test1:(int)a test2:(int)b;

これだと、メソッド名が test1 二つ目の引数のラベル名が test2となっています。
しかし、メソッド名の正式名称は「test1:test2:」となります。コロンも忘れずに。
メソッドの宣言ではコロンの後に引数が来ます。そのため、コロンの数と引数の数は同じになる訳です。

さらに引数が増えると「ラベル:(引数型)引数名」が後ろに増えていくことになります。

もうこのあたりで、今までの言語の常識とは違いますねww
しかし、この書き方はパッとソースコードを見たときに処理の内容が分かりやすくなっています。明らか面倒ですが(笑