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