Objective-C эквивалент Java перечислений или "статических финальных" объектов - PullRequest
4 голосов
/ 30 марта 2011

Я пытаюсь найти Objective-C, эквивалентный либо типам перечисления Java, либо объектам "public static final", таким как:

public enum MyEnum {
    private String str;
    private int val;
    FOO( "foo string", 42 ),
    BAR( "bar string", 1337 );
    MyEnum( String str, int val ) {
        this.str = str;
        this.val = val;
    }
}

или

public static final MyObject FOO = new MyObject( "foo", 42 );

Мне нужно создать константы, которые являются константами (конечно) и доступны везде, где импортируется связанный файл .h, или глобально.Я пробовал следующее безуспешно:

Foo.h:

static MyEnumClass* FOO;

Foo.m:

+ (void)initialize {
    FOO = [[MyEnumClass alloc] initWithStr:@"foo string" andInt:42];
}

Когда я сделал это и попытался использоватьконстанта FOO не имеет значений в переменных str и val.С помощью вызовов NSLog я подтвердил, что на самом деле вызывается initialize.

Кроме того, хотя я ссылаюсь на переменную FOO в тестовом блоке кода, Xcode выделил строкув файле .h, показанном выше с комментарием 'FOO' defined but not used.

Я совершенно сбит с толку!Спасибо за любую помощь!

1 Ответ

5 голосов
/ 30 марта 2011

Используйте extern вместо static:

Foo.h:

extern MyEnumClass* FOO;

Foo.m:

MyEnumClass* FOO = nil; // This is the actual instance of FOO that will be shared by anyone who includes "Foo.h".  That's what the extern keyword accomplishes.

+ (void)initialize {
    if (!FOO) {
        FOO = [[MyEnumClass alloc] initWithStr:@"foo string" andInt:42];
    }
}

static означает, чтопеременная является приватной в пределах одного модуля компиляции (например, одного файла .m).Поэтому использование static в заголовочном файле создаст частные экземпляры FOO для каждого файла .m, который включает в себя Foo.h, а это не то, что вы когда-либо хотели бы.

...