Как вы инициализируете константу в файле заголовка?Как инициализируются константы в заголовочных файлах Objective-C?
Например:
@interface MyClass : NSObject {
const int foo;
}
@implementation MyClass
-(id)init:{?????;}
Как вы инициализируете константу в файле заголовка?Как инициализируются константы в заголовочных файлах Objective-C?
Например:
@interface MyClass : NSObject {
const int foo;
}
@implementation MyClass
-(id)init:{?????;}
Для "общественных" констант, вы объявляете его как extern
в файле заголовка (.h) и инициализировать его в файл реализации (.m).
// File.h
extern int const foo;
затем
// File.m
int const foo = 42;
Рассмотрите возможность использования enum
, если это не только один, но несколько констант, принадлежащие вместе
Объективных классов 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
Простым способом для констант типа значения, как целые числа является использование 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.
Что делать, если мне нужно 'typedef NS_ENUM'? – ManuQiao