Objective-c постоянная статическая NSArray - PullRequest
1 голос
/ 23 августа 2011

Я программист на 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).

1 Ответ

1 голос
/ 23 августа 2011

Я программист на Java, […]

Вот твоя проблема.

Objective-C во многом отличается от языка Java, и многие идиомы могут быть для вас совершенно чужды.

В качестве примера; почему вы хотите или должны знать, с какими формами многоугольников может работать класс Polygon?

Если вы пытаетесь создать многоугольник с определенным количеством углов, но не можете, тогда да, вам нужно знать.

Помимо этого? Не очень полезная информация, по крайней мере, насколько я вижу.

На самом деле, зачем форме многоугольника даже знать, какие существуют другие фигуры?

Отбросьте на мгновение саму идею из static и пересмотрите свою проблему. Просвещение обязательно последует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...