Как константы инициализируются в заголовочных файлах Objective C? - PullRequest
7 голосов
/ 31 мая 2010

Как вы инициализируете константу в заголовочном файле?

Например:

@interface MyClass : NSObject {

  const int foo;

}

@implementation MyClass

-(id)init:{?????;}

Ответы [ 3 ]

16 голосов
/ 31 мая 2010

Для "публичных" констант вы объявляете это как extern в своем заголовочном файле (.h) и инициализируете это в своем файле реализации (.m).

// File.h
extern int const foo;

тогда

// File.m
int const foo = 42;

Рассмотрите возможность использования enum, если это не одна, а несколько констант, принадлежащих друг другу

12 голосов
/ 31 мая 2010

Классы Objective C не поддерживают константы как члены. Вы не можете создать константу так, как хотите.

Ближайший способ объявить константу, связанную с классом, - определить метод класса, который ее возвращает. Вы также можете использовать extern для прямого доступа к константам. Оба продемонстрированы ниже:

// header
extern const int MY_CONSTANT;

@interface Foo
{
}

+(int) fooConstant;

@end

// implementation

const int MY_CONSTANT = 23;

static const int FOO_CONST = 34;

@implementation Foo

+(int) fooConstant
{
    return FOO_CONST; // You could also return 34 directly with no static constant
}

@end

Преимущество версии метода класса состоит в том, что она может быть расширена для обеспечения постоянных объектов довольно легко. Вы можете использовать внешние объекты, но вы должны инициализировать их в методе инициализации (если они не являются строками). Поэтому вы часто будете видеть следующую схему:

// header
@interface Foo
{
}

+(Foo*) fooConstant;

@end

// implementation

@implementation Foo

+(Foo*) fooConstant
{
    static Foo* theConstant = nil;
    if (theConstant == nil)
    {
        theConstant = [[Foo alloc] initWithStuff];
    }
    return theConstant;
}

@end
0 голосов
/ 17 октября 2013

Простой способ для констант типа значения, таких как целые числа, состоит в использовании enum hack , как подсказал unbeli.

// File.h
enum {
    SKFoo = 1,
    SKBar = 42,
};

Одним из преимуществ по сравнению с extern является то, что все это разрешается во время компиляции, поэтому для хранения переменных не требуется памяти.

Другой метод - использовать static const, который должен был заменить взлом enum в C / C ++.

// File.h
static const int SKFoo = 1;
static const int SKBar = 42;

Быстрое сканирование заголовков Apple показывает, что метод взлома enum представляется предпочтительным способом сделать это в Objective-C, и я на самом деле считаю его чище и использую его сам.

Кроме того, если вы создаете группы параметров, вам следует рассмотреть возможность использования NS_ENUM для создания безопасных для типов констант.

// File.h
typedef NS_ENUM(NSInteger, SKContants) {
    SKFoo = 1,
    SKBar = 42,
};

Более подробная информация о NS_ENUM и его двоюродном брате NS_OPTIONS доступна по адресу NSHipster .

...