Objective-Cの基本「クラス」を学ぶ
2014年1月12日:Objective-C
Objective-CはC言語から派生した言語です。C言語と似てはいるのですが、書き方がかなり異なるのである程度理解しておく必要がります。ここでは、C言語とくらべてObjective-Cが変わっている場所であるクラスをピックアップして解説します。
プロジェクトの作成
まずプログラムを動かすためのプロジェクトを作成します。empty applicationのプロジェクトをつくってください。
そしたら、AppDelegate.mができるので、ここにあるdidFinishLaunchingWithOptionsにプログラムを書いていきます。
コンソールを使ってみよう
試しに以下のように書いて実行してみてください。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; NSLog(@"Test");//追加 return YES; }
一行追加しただけです。すると、以下のようにコンソールにTestが出力されます。
このコンソールを使いながら、Objective-Cを学んでいきます。ここで使用したNSLogにint型の変数の内容を表示させるには
int a=1,b=2; NSLog(@"%d,%d",a,b);
とします。%dはC言語おなじみのフォーマット演算子です。以下に一覧を表示しておきます。
フォーマット指定子 | 詳細 |
---|---|
%@ | オブジェクトのdescriptionプロパティ、文字列オブジェクトの文字 |
%d,%D | 整数(int) |
%u,%U | 符号なし整数(unsigned int) |
%x | 16進数の整数(0-9,a-f) |
%X | 16進数の整数(0-9,A-F) |
%o,%O | 8進数の整数 |
%f | 浮動小数点(double) |
%.桁数f | 浮動小数点の小数点以下の桁数を指定 |
%e,%E | 指数表記する |
%.桁数e, %.桁数E | 指数表記する、小数点以下の桁数を指定 |
%c | char型の英数文字の一文字 |
%% | %の文字 |
クラスとは
C++などではクラスをよく使います。Objective-Cにもクラスがあります。クラスとは変数と関数を一緒にした塊です。変数と関数をまとめたものを用意することで多くの利点が得られます。例えば、プログラムではよくボタンを使用します。ボタンには、ボタンの大きさや色などのデータ(変数)と、ボタンを押した際の動作(関数)が必要です。ボタンごとに変数や関数を
//ボタン1の変数と関数 int button1_width; int button1_height; int button1_color; void button1_push(); //ボタン2の変数と関数 int button2_width; int button2_height; int button2_color; void button2_push();
と同じように定義していってもいいのですが、面倒だしプログラムが長くなって複雑です。ボタンの基本設計を変えた際、すべての変数や関数を変える必要があります。
クラスでは、変数と関数を一つの固まりとして定義します。クラスでは、変数のことをプロパティ、関数のことをメソッドと呼びます。クラスを使えばボタンのクラスを一つ作れば、簡単に複数のボタンを導入できます。例えば、
ボタンクラスの定義; ボタンクラス A; ボタンクラス B;
とはじめにボタンクラスを定義してボタンA、Bをつくることができます。クラス定義からつくられたものをオブジェクトといいます(ここではAとBがオブジェクト)。そして、クラス定義からオブジェクトをつくることをインスタント化するといいます。
クラスの利用
では試しに、Objective-Cでクラスを使ってみます。まず、AppDelegate.hに以下のように記述し
@interface TestClass :NSObject{ NSInteger d; //protected @private NSInteger c; @public NSInteger a,b; } //メソッドの定義 //引数なし -(void)plus; //引数1つ -(NSInteger)minus:(NSInteger)e; //引数2つ -(NSInteger)times:(NSInteger)e :(NSInteger)f; //クラスメソッド +(void)show; @end
つまり、クラスを作るには
@interface クラス名:親クラス{ 変数 } メソッド @end
とします。メソッドとは関数のことです。親クラスがない場合はNSObjectを指定します。Objective-CではNSObjectを継承している前提で作っているからです。TestClassを見ていくと、変数としてa,b,c,dを定義しています。
- protected->クラス内かサブクラス内でアクセス可能
- private->クラス内のみでアクセス可能
- public->外部からアクセス可能
です。この辺はC++と同じですね。そして、plus,minus,timesという3つのメソッドが定義されています。
-(戻り値)名前:引数1:引数2; +(戻り値)名前:引数1:引数2;
という形になっています。「-」を頭につけるメソッドはインスタントメソッドと呼ばれ、クラスをインスタントしてからしか使えません。一方、「+」を頭につけるメソッドはクラスメソッドと呼ばれ、クラスからいきなり使用できます。例えば、クラスをインスタント化する際のメモリ確保で使用するallocがクラスメソッドです。では、AppDelegate.mに以下のようにメソッドの具体例を記入します。
@implementation TestClass -(void)plus { c=a+b; } -(NSInteger)minus:(NSInteger)e { return a-e; } -(NSInteger)times:(NSInteger)e :(NSInteger)f { return e*f; } +(void)show { NSLog(@"SHOW!"); } @end
ではクラスを使ってみましょう。AppDelegate.mを以下のようにします。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch. self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; TestClass *class=[TestClass alloc]; //メモリ確保 class=[class init]; //クラスの初期化 class->a=1; class->b=2; [class plus]; NSInteger c=[class minus:1]; NSInteger d=[class times:2 :3]; NSLog(@"%d,%d,%d",class->b,c,d); [TestClass show];//クラスからいきなり使える return YES; }
クラスを使うときは初期化が必要です。クラスの初期化は以下のように行います。
※インスタント化
クラス名 *名前=[クラス名 alloc]; //メモリを確保
名前=[名前 init]; //クラスを初期化
※一行で書きたい場合
クラス名 *名前=[[クラス名 alloc] init];
コードではクラスを定義した後に
class->a=1; class->b=2;
でpublic変数に代入しています。メソッドを使用する場合は13行にある[class minus:1]のように
※インスタントメソッドの使用方法
[オブジェクト名 メソッド:引数]
※クラスメソッドの使用方法
[クラス名 メソッド:引数]
の形で使用します。実行すると
2,0,6
SHOW!
が出力されます。
以上でクラスの解説を終わります。Objective-Cではクラスの記述が独特なので注意しましょう。
著者:安井 真人(やすい まさと)
@yasui_masatoさんをフォロー