Цель-c постоянный статический NSArray

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


person Pavle Gartner    schedule 23.08.2011    source источник


Ответы (1)


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

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

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

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

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

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

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

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

person Williham Totland    schedule 23.08.2011
comment
Спасибо за быстрый ответ. Я знаю, что Objective-C совсем другой, но я хотел бы добиться чего-то похожего на статические конечные переменные Java в целом. Однако PolygonShape, возможно, плохой пример... - person Pavle Gartner; 23.08.2011
comment
@PavleGartner: Я понял, моя точка зрения заключалась в том, что статические конечные переменные на самом деле не то, что вы используете в Objective-C, в какой-либо значительной степени. Это образец другого языка программирования и другой структуры. Сначала подумайте о том, чего вы хотите достичь, а затем о том, как этого достичь. (статические переменные, кстати, как) - person Williham Totland; 23.08.2011
comment
Я всегда думал, что Objective-C мог бы, возможно, добавить литерал прочь, например, у нас есть строковые литералы, например, точно так же, как мы объявляем строковые литералы, такие как @My String, возможно, у нас могли бы быть литералы массива, такие как @{@One,@Two}, потому что все мы могли бы вставить в них строковые литералы, если только это не добавило аналогичный синтаксис для других типов, таких как @5 для литерала NSNumber. - person Nathan Day; 23.08.2011