私は Java プログラマーで、Objective-C を学んでおり、変数の実装に問題があります。これは、Java の静的最終クラス変数と同様です。クラス PolygonShape では、クラス内外からアクセスできる多角形タイプの NSDictionary が必要です。私はすでに次のことを試しました:
PolygonShape.h:
...
extern NSDictionary *polygonTypes;
@interface PolygonShape
...
PolygonShape.m:
...
NSDictionary *polygonTypes = nil;
@implementation PolygonShape
- (id)init {
self = [super init];
if (self) {
if(!polygonTypes) {
polygonTypes = [NSDictionary dictionaryWithObjectsAndKeys:
@"triangle", [NSNumber numberWithInt: 3], @"quadrilateral", [NSNumber numberWithInt: 4],
@"pentagon", [NSNumber numberWithInt: 5], @"hexagon", [NSNumber numberWithInt: 6],
@"heptagon", [NSNumber numberWithInt: 7], @"octagon", [NSNumber numberWithInt: 8],
@"enneagon", [NSNumber numberWithInt: 9], @"decagon", [NSNumber numberWithInt: 10],
@"hendecagon", [NSNumber numberWithInt: 11], @"dodecagon", [NSNumber numberWithInt: 12], nil];
}
}
...
しかし、PolygonShape のインスタンスを初期化せずに他の場所 (main.m など) からポリゴン タイプにアクセスしたい場合、変数 polygonTypes は nil になるため、これでは十分ではありません。だから私は正常に動作する静的関数を使用しました:
PolygonShape.m:
static NSDictionary *polygonTypes = nil;
@implementation PolygonShape
...
+ (NSDictionary *) polygonTypesDicionary {
if(!polygonTypes) {
polygonTypes = [NSDictionary dictionaryWithObjectsAndKeys:
@"triangle", [NSNumber numberWithInt: 3], @"quadrilateral", [NSNumber numberWithInt: 4],
@"pentagon", [NSNumber numberWithInt: 5], @"hexagon", [NSNumber numberWithInt: 6],
@"heptagon", [NSNumber numberWithInt: 7], @"octagon", [NSNumber numberWithInt: 8],
@"enneagon", [NSNumber numberWithInt: 9], @"decagon", [NSNumber numberWithInt: 10],
@"hendecagon", [NSNumber numberWithInt: 11], @"dodecagon", [NSNumber numberWithInt: 12], nil];
}
return polygonTypes;
}
これで問題ありませんが、これを行う最善の方法は何ですか?また、クラスメソッドで初期化せずに NSDictionary に extern を使用することは可能ですか? (そして、singeltonクラスについては知っていますが、PolygonShapeクラス内にポリゴンタイプの定数配列が本当に欲しいです)。