2010-05-31 3 views

ответ

16

Для "общественных" констант, вы объявляете его как extern в файле заголовка (.h) и инициализировать его в файл реализации (.m).

// File.h 
extern int const foo; 

затем

// File.m 
int const foo = 42; 

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

+0

Что делать, если мне нужно 'typedef NS_ENUM'? – ManuQiao

12

Объективных классов 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

Добавлен еще один бит, который я только что подумал о – JeremyP

+0

. Возможно, было бы интересно указать, что шаблон, который вы написали, называется singleton и часто используется для обмена файлами по всем приложениям. Хорошим примером в iPhone dev является класс AppDelegate. – moxy

0

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

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

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

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

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

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

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

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

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

Смежные вопросы