クラスを作ってみる

前回の構造体の次は、クラスです。
クラスと言っても細かいとことか結構いろいろあるんで、とりあず作ってみることにします。
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;
}