Objective-C 宣言プロパティの更なる理解.
前回、宣言プロパティの概念と基本的な使い方を解説しました。大まかに言えば以下のように、アクセサを省略して書くことができるものだと考えてもいいかもしれません。
今回は宣言プロパティの使い方をもう少し詳しく見て行きましょう。
プロパティ名とインスタンス変数名を区別する
上の例では、@propertyで宣言している名前は、インスタンス変数と同じです。 これを別の名前で定義することによって、外部からのアクセス時に使う変数と、内部からしかアクセスしない変数を明示的に区別することができます。
以下のように、まず@property定義時に外部アクセス用の変数名を宣言し、@synthesizeでインスタンス変数と外部用の変数を結びつけてやります。
/* Human.h */ @interface Human : NSObject { BOOL man; NSString* name; int starSign; } @property BOOL Man; //別の名前を外部用に定義 @end /* Human.m */ @implementation Human @synthesize Man = man; //Manとmanを結びつける -(id)init { } @end
アクセサメソッドを自分で定義する方法
@synthesizeを用いれば、対応するプロパティ用にアクセサメソッドが自動で生成されました。しかし、細かな設定を行うため自分でアクセサメソッドを記述したい場合があります。
例えば、前回使用したNSString型のnameというインスタンス変数を考えてみましょう。
- ゲッタで参照された場合は、名前の前に”Mr.”を付けて外部へ出したい
- セッタで書き込まれる時は、常に小文字に変換したい
というような処理を行いたい場合は、独自のアクセサを作る必要があります。
このために@dynamicというコンパイラ指示子が用意されています。これはコンパイラに、プロパティは宣言されてるけど、アクセサを自動生成しなくてもいいよということを教えるものです。
以下のように使います。
/* Human.h */ @interface Human : NSObject { BOOL man; NSString* name; int starSign; } @property NSString* name; @end /* Human.m */ @implementation Human @dynamic name; -(void)setName:(NSString*)newName { name = [newName lowercaseString]; } -(NSString*)name { NSString* outName = [NSString* stringWithFormat:@"Mr.%@", name]; return outName; } -(id)init { } @end
ここで”lowercaseString”は文字列を小文字に変換するNSStringクラスのメソッドで、”stringWithFormat”は変数などから文字列を構成する事ができるメソッドです。
@dynamicを使う事によってオリジナルなアクセサを作ることができます。
ドット演算子を用いたアクセス
Objective-C 2.0からドット演算子「.」を用いてアクセサメソッドを呼び出せるようになったらしいです。
この使い方としてはCの構造体を使う感覚に非常に近いです。
文字で書いていてもイメージがつかみにくいと思うので、早速プログラムを見てみましょう。
Humanクラスのオブジェクトobjを作り、manとnameの値にアクセスしてみたいと思います。(Humanクラスの定義に付いては前回の投稿を参照してください。)
/*アクセサを使う場合*/ BOOL Man = [obj man]; [obj setName:@"Nick"]; /*ドット演算子を使う場合*/ BOOL Man = obj.man; obj.name = @"Nick";
後半部分がドット「.」を使ったプロパティへのアクセスです。manの読み込みをnameへの書き込みを行なっています。
どちらもドットでオブジェクトとプロパティ名をつなげるだけで、アクセサと同じ働きをしてくれます。
ドット演算子を使った参照を続けて書くこともできます。
budget = obj.money.count; obj.money.coinCount = 0;
この2つの処理は以下の処理と同じになります。
budget = [[obj money] count]; [[obj money] setCoinCount:0];
このようにドット演算子を用いれば、感覚的にそのオブジェクトのプロパティにアクセスできるようになります。
次回は、プロパティの属性について解説し、宣言のしかたを詳しく見て行きましょう。