Objective-Cの第三歩 クラスとクラスメソッドを定義する
公開日:
:
iOSアプリを書く! Objective-C, Xcode, オブジェクト指向
Swiftの事をひとまず置いておいてObjective-Cの入門編を書いているわけだが、前々回の”Hello, World!”表示、前回のピュアなC言語としてObjective-Cを使ってしまう試みに続いて、今回はいよいよObjective-Cの”Objective”たる部分に侵入していく。WEB系言語の習得者にとっては第三歩目、そしてC言語習得者にとってはやっと第一歩目となる入門編である。
Objective-Cのクラスの書き方はかなり特殊
オブジェクト指向自体については、WEB系言語でも勿論その仕組みがあるはずなので、概念等については改めて説明しない。PHPでもJavaScriptでも、参考書のオブジェクト指向部分をあらかじめ通読されたし。で、それらの準モダンな言語のオブジェクト指向と、Objective-Cのオブジェクト指向部分については見た目からしてかなり違う。
そこで、書式にフォーカスして少しずつ解説していこうと思う。ということで、前回の1からxまで計算するC言語関数をクラスに移植して、クラスのクラスメソッドで計算させるという、クラス化の意味がそんなにない例から入っていく。つまり、今回の入門編を読むことによって、Xcodeでのクラスの作成方法、クラスとクラスメソッド定義のための書式、クラスのメソッドの引数を伴った呼び出し方のみが理解できるということ。
Xcodeで新規クラスを作成
前回と同じく、コマンドラインアプリケーションを新規プロジェクトとして作成する。続いて、FileメニューのNewからFile…を選ぶ。ダイアログが出るので、OSX CocoaのObjective-C classを選択して、クラス名はsummaryとする。
すると、左側のファイルツリーにsummary.hというファイルと、summary.mというファイルが追加されたはずである。この.hと.mの組み合わせがセットになる。
.hと.mそれぞれの役割については、こないだのエントリで説明したように.hがプロトタイプ宣言みたいなのをまとめた宣言部で、.mが実装部ということになる。
Objective-Cクラスの宣言と実装
宣言部のsummary.hを見てほしい。コメント以外の部分はこのように書いてあるはずだ。
#import <Foundation/Foundation.h> @interface summary : NSObject @end |
#importの役割については説明済み。その後に出てくる、@interfaceというもの。これはC言語にも出てこない特殊な表現である。
“@”ではじまる命令は、コンパイラディレクティブといい、Objective-Cのコンパイラを制御する命令である。以降ちょくちょく登場するが、ピュアなC言語に対してあえて目立ち易くした建て増し部分として認識しておこう。
さて、@interfaceというコンパイラディレクティブが何かというと、@endまでのブロックでクラスのインターフェイスを宣言しますよという命令である。上記の例では、NSObjectクラスを継承したsummaryというクラスのインターフェイスを宣言している。NSObjectというのはObjective-Cの基底クラスで、全てのオブジェクトは少なくともこれを継承していることが望ましい。勿論、より具体的なNSObjectの子孫クラスを継承することも可能であるが、とりあえず余計な拡張が必要無かったり、何を継承するのが最適か分からなかったりする場合にはNSObjectを継承しておけば良い。継承は、クラス名の横に”:”をつけて、継承元クラスを続ける。
Objective-Cの中身が空なので、ここで今回使用するクラスメソッド、Calculateを宣言しておこう。
#import <Foundation/Foundation.h> @interface summary : NSObject + (int)Calculate:(int)x; @end |
クラスメソッドの宣言は、”+”記号を使う。メソッド名の左側括弧には返り値の型、右側には引数がある場合”:”を挟んで括弧に入った型と引数名を続ける。
続いて、クラスの実装部である。最初の状態においては、summary.mのコードは以下のようになっている。
#import "summary.h" @implementation summary @end |
冒頭の#importで、先程記述したsummary.hを読み込んでいる。コンパイラディレクティブの@implementationと@endの間に、クラスメソッドCalculateの実装コードを記述すれば良いわけである。
#import "summary.h" @implementation summary + (int)Calculate:(int)x{ int i,sum=0; for(i=x;i>=1;i--){ sum += i; } return sum; } @end |
というわけで、実装したのが上のコード。宣言部と同じくクラスメソッドなので”+”から始まる。中身は通常の関数定義と同じ。今回はプロパティの宣言も無く、インスタンスプロパティ・メソッドも無かったためこれで充分。
Objective-Cクラスのメソッド呼び出し
最後に、今回作成したクラスsummaryとクラスメソッドCalculateを呼び出してみよう。main.mの記述を以下のようにする。
#import <Foundation/Foundation.h> #import "summary.h" int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... int x,sum; printf("数字を何か入力して下さい\n"); scanf("%d",&x); sum = [summary Calculate:x]; printf("1から%dまでの和は%dです",x,sum); } return 0; } |
#importでは、Foundationに加えて忘れずにsummary.hを読み込む。クラスメソッドの呼び出しを行っているのは、[summary Calculate:x]の部分。メソッド名の呼び出しは[クラス名 メソッド名]という書き方で行われる。引数に値を代入して呼び出す場合にはメソッド名の後に”:”で続ける。
以上で、C言語で書いたsummary関数をクラスを使って書き直すチュートリアルが終わり。さてさて次回は、プロパティの宣言やインスタンスメソッドの実装を行い、summaryクラスをよりクラスらしいクラスへと膨らませていくとしよう。
関連記事
-
Objective-CでiOSアプリの第一歩 新規プロジェクトで生成されるコードの解説
しけたコンソールアプリばかり作っていたけれど、ようやっとiOSプログラミングに入るとしよう。急がない
-
Objective-Cの第五歩 クラスの継承とメソッドのオーバーライド
前回Objective-Cの第四歩では、等差数列の和を計算するプログラムGaussTesterの作成
-
Objective-Cの第四歩 インスタンスプロパティ・メソッドを定義する
Objective-Cの第三歩では、ピュアC言語からのObjective-Cのクラス入門ということで
-
Objective-Cでは何故.hファイルと.mファイルを作成させられるのか
前回説明したように、Objective-Cでプログラムを書く際には、別にC言語そのもののつもりで書い
-
iOSプログラミング入門書では、まず最初のHello, World!すら難しい
Hello, World!が第一歩 新しくプログラミング言語を習得するときに、「この言語でのH
-
Objective-CでiOSアプリの第二歩 とにかく立ち上がればというレベルのHello, World!アプリを作成
前回はiOSアプリ作成の第一歩として、Empty Applicationを選択した際に書いてあるコー
-
Objective-Cの第一歩(仕切り直し)
前回Objective-Cの第一歩として挙げたコードであるが、綺麗さっぱり忘れてほしい。というのは、
-
Objective-CでiOSアプリの第三歩 UIViewControllerの必要性を理解する
前回はUIViewControllerの存在を無視して"Hello, World!"アプリケーション
-
Xcode 6の正式リリースまでに、Objective-Cでアプリを一つ仕上げる!
Swiftに早速触れてみたい!でもXcode 6がベータ版の間は、有料(7800円/年)のDevel
-
Objective-Cの第六歩 プロトコルの宣言と実装
Objective-Cの第五歩では、親クラスの継承とメソッドのオーバーライドについて説明した。そこま