クラスを作ってみる
前回の構造体の次は、クラスです。
クラスと言っても細かいとことか結構いろいろあるんで、とりあず作ってみることにします。
Objective-Cのクラスは、インターフェイスとその実装でわかれてます。
インターフェイスは、ヘッダファイルなんですけどね。
インターフェイスは、インスタンス変数定義とインスタンスメソッド定義を書きます。
インターフェイスに変数を定義するのが、他の言語と違うかもしれません。
変数定義は、下の感じになります。
#import <Foundation/Foundation.h> @interface Person : NSObject { @private NSNumber *personId; NSString *personName; } @end
あ!それとですね、インターフェイスは、必ずNSObjectを継承しないと駄目です。
@〜みないやつは、コンパイラ指示子です。
@interface〜@endまでが、インターフェイス定義の部分のことを表しています。
@privateは、変数のアクセス制限を表してます。
@private以外には、@protectedと@publicがあります。
@privateは、クラス内のみ参照可能で、@protectedは、自クラス及びサブクラスのみ参照可能です。
@publicは、全解放になります。
ちなみに、下みたいに書くこともできます。
@private NSNumber *personId; @private NSString *personName
次にメソッド定義ですが、こんな感じになります。
#import <Foundation/Foundation.h> @interface Person : NSObject { @private NSNumber *personId; NSString *personName; } - (void)setPersonId:(NSNumber *)personId; - (NSNumber *)personId; - (void)setPersonName:(NSString *)personName; - (NSString *)personName; @end
えっとですね、[-]は、インスタンスメソッド定義を表してます。
後は、戻り値とメソッド名と引数を表してます。
オブジェクト指向言語なんで、インスタンス変数とかは、
@privateか@protectedにしておきましょう。
外部からアクセスする場合は、アクセッサメソッドを経由してアクセスさせましょう。
Objective-Cには、コーディング規約があって、
値を設定する場合は、set〜で、値を取得する場合、変数名と同じにしないといけないらしい。
なので、personIdの変数へのアクセスするメソッドの場合は、
setPersonIdとpersonIdと定義します。
続いて、実装クラスですが、こんな感じです。
#import "Person.h" @implementation Person - (void)setPersonId:(NSNumber *)id { personId = id; } - (NSNumber *)personId { return personId; } - (void)setPersonName:(NSString *)name { personName = name; } - (NSString *)personName { return personName; } @end
@〜みないやつは、インターフェイスの時と同じです。
インスタンスメソッドも大体同じで、実装があるだけです。
それで、実際のインスタンスの作り方ですが、allocとinitを使います。
Person *person = [[Person alloc]init];
次にメソッドの呼び方ですが、こうです。
[person setPersonName:@"TestUser"];
なので、テスト用コードは、こんな感じになります。
#import %lt;Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { Person *person = [[Person alloc]init]; [person setPersonId:[NSNumber numberWithInt:10]]; [person setPersonName:@"TestUser"]; return 0; }