Я программист Java, изучаю Objective-C, и у меня есть проблема с реализацией переменных, похожих на переменные статического конечного класса в Java. В классе PolygonShape я хотел бы иметь NSDictionary с типами полигонов, доступ к которым можно получить как внутри, так и снаружи класса. Я уже пробовал следующее:
МногоугольникShape.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];
}
}
...
Но этого недостаточно, потому что если я хочу получить доступ к типам полигонов из другого места (например, из main.m) без инициализации экземпляра PolygonShape, переменная polygonTypes равна нулю. Поэтому я использовал статическую функцию, которая отлично работает:
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;
}
Теперь это нормально, но мне интересно, как лучше всего это сделать и можно ли использовать extern для NSDictionary без необходимости инициализировать его в методе класса? (и я знаю о классах синглтона, но мне бы очень хотелось иметь постоянный массив типов полигонов внутри класса PolygonShape).