クラスを作る! (4/7)
作成:2011-02-07 11:03
更新:2011-02-07 11:13
更新:2011-02-07 11:13
■メソッドの定義
インスタンス変数の定義は、このように割と簡単です。問題は、メソッドの定義です。
Objective-Cのメソッドの定義は、関数の定義とはちょっと書き方が違っています。受け渡す引数などによってもだいぶ感じが違ってしまうのです。基本的な書き方を整理すると、だいたい以下のような形で記述されます。
なんだかわからないですか? 最初の「-」は、「インスタンスメソッド」というものであることを示す記号です。メソッドには、「インスタンスで利用するためのもの」と「クラスから直接利用出来るもの」があります。普通、クラスはインスタンスというのを作って利用しますが、そうしたインスタンスで利用するメソッドは、このように-記号をつけて記述します。そしてその後に、()で返値を指定します。
問題となるのは、その後でしょう。なんだかわけがわからないですね。Objective-Cでは、メソッドは「キーワード」と「引数」の組み合わせで定義されています。が、関数のように、引数はまとめて()内に記述……という形にはなっていません。
メソッドの定義では、返値の後、まずキーワードが指定されます。特に引数などがなければ、最後に;をつけておしまいです。が、引数を持っている場合には、キーワードの後に:記号(コロン)を付け、その後に引数のタイプと受け渡される変数名を記述します。この「キーワード:(返値)変数」というのがひとつのセットとなっている、と考えてよいでしょう。
これが、必要に応じていくつもつなげられていく形でメソッドは定義されています。ここでのサンプルでは、キーワード1つのみのもの(message、printMessage)と、キーワードに引数が1つあるもの(setMessage)が用意されていたわけですね。
こうして、@interface部分に、メソッドの宣言を用意し、全く同じ形で@implementation部分に、メソッドの具体的な実装を用意します。実装部分では、メソッドの宣言の後に{}で実際に実行する処理を記述します。メソッドの返値やキーワード、引数の指定などは両者で同じ形にしておく必要があります。でないと、「ヘッダーにあるこのメソッド宣言の実装部分がこれだな」ということがわからなくなってしまいます。
さて、実装部分で行っているのは、そう難しいことではありません。引数の値をインスタンス変数に設定したり、インスタンス変数をreturnで返したり、あるいは前回やったNSLogというものでテキストを出力したり、といった単純な作業です。
見ればわかるように、それぞれのクラスに用意されたインスタンス変数は、普通の変数と同様に変数名を書いてそのまま利用できます。インスタンス変数は、そのインスタンス内に常に保管されていますから、どのメソッドからでも自由に利用出来るのです。
また、printMessageでは、NSLogを使っていますが、これは以下のような形でメッセージを出力していることがわかるでしょう。
ここでは、インスタンス変数messageを@"%@"というようにしてテキストに埋め込んでいますね。messageは、テキストを保管するものでした。が、Objective-Cのテキストは、NSStringというクラスのインスタンスとして扱われるのでした。つまり、テキストだけれど、これは「クラスのインスタンス」なのです。したがって、%@を使わないといけないのですね。
Objective-Cのメソッドの定義は、関数の定義とはちょっと書き方が違っています。受け渡す引数などによってもだいぶ感じが違ってしまうのです。基本的な書き方を整理すると、だいたい以下のような形で記述されます。
-( 返値 ) キーワード;
-( 返値 ) キーワード:( タイプ ) 引数;
-( 返値 ) キーワード:( タイプ ) 引数 キーワード;
-( 返値 ) キーワード:( タイプ ) 引数 キーワード:( タイプ ) 引数;
……以下略……
なんだかわからないですか? 最初の「-」は、「インスタンスメソッド」というものであることを示す記号です。メソッドには、「インスタンスで利用するためのもの」と「クラスから直接利用出来るもの」があります。普通、クラスはインスタンスというのを作って利用しますが、そうしたインスタンスで利用するメソッドは、このように-記号をつけて記述します。そしてその後に、()で返値を指定します。
問題となるのは、その後でしょう。なんだかわけがわからないですね。Objective-Cでは、メソッドは「キーワード」と「引数」の組み合わせで定義されています。が、関数のように、引数はまとめて()内に記述……という形にはなっていません。
メソッドの定義では、返値の後、まずキーワードが指定されます。特に引数などがなければ、最後に;をつけておしまいです。が、引数を持っている場合には、キーワードの後に:記号(コロン)を付け、その後に引数のタイプと受け渡される変数名を記述します。この「キーワード:(返値)変数」というのがひとつのセットとなっている、と考えてよいでしょう。
これが、必要に応じていくつもつなげられていく形でメソッドは定義されています。ここでのサンプルでは、キーワード1つのみのもの(message、printMessage)と、キーワードに引数が1つあるもの(setMessage)が用意されていたわけですね。
こうして、@interface部分に、メソッドの宣言を用意し、全く同じ形で@implementation部分に、メソッドの具体的な実装を用意します。実装部分では、メソッドの宣言の後に{}で実際に実行する処理を記述します。メソッドの返値やキーワード、引数の指定などは両者で同じ形にしておく必要があります。でないと、「ヘッダーにあるこのメソッド宣言の実装部分がこれだな」ということがわからなくなってしまいます。
さて、実装部分で行っているのは、そう難しいことではありません。引数の値をインスタンス変数に設定したり、インスタンス変数をreturnで返したり、あるいは前回やったNSLogというものでテキストを出力したり、といった単純な作業です。
見ればわかるように、それぞれのクラスに用意されたインスタンス変数は、普通の変数と同様に変数名を書いてそのまま利用できます。インスタンス変数は、そのインスタンス内に常に保管されていますから、どのメソッドからでも自由に利用出来るのです。
また、printMessageでは、NSLogを使っていますが、これは以下のような形でメッセージを出力していることがわかるでしょう。
NSLog(@"%@",message);これは、printfと同様に、最初にフォーマットの内容を記述したテキストを用意し、第2引数以降の値をそれに埋め込んで出力する働きを持ちます。ここでは「%@」という記号がテキストに書かれていますが、これはその後にある「インスタンス」を埋め込むためのものです。インスタンスは、このようにしてその内容をテキストの形で出力することができます。
ここでは、インスタンス変数messageを@"%@"というようにしてテキストに埋め込んでいますね。messageは、テキストを保管するものでした。が、Objective-Cのテキストは、NSStringというクラスのインスタンスとして扱われるのでした。つまり、テキストだけれど、これは「クラスのインスタンス」なのです。したがって、%@を使わないといけないのですね。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※メソッドの定義部分 -(void)setMessage:(NSString*) str; -(NSString*)message; -(void)printMessage; ※メソッドの実装部分 -(void)setMessage:(NSString*) str { message = str; } -(NSString*)message { return message; } -(void)printMessage { NSLog(@"%@",message); }
※関連コンテンツ
「初心者のためのObjective-Cプログラミング入門」に戻る