Jak zainicjalizować stałą w pliku nagłówkowym?W jaki sposób są inicjalizowane stałe w plikach nagłówkowych Objective-C?
Na przykład:
@interface MyClass : NSObject {
const int foo;
}
@implementation MyClass
-(id)init:{?????;}
Jak zainicjalizować stałą w pliku nagłówkowym?W jaki sposób są inicjalizowane stałe w plikach nagłówkowych Objective-C?
Na przykład:
@interface MyClass : NSObject {
const int foo;
}
@implementation MyClass
-(id)init:{?????;}
Dla "publicznych" stałych, zadeklarować ją jako extern
w pliku nagłówka (.h) i zainicjować go w pliku wdrażania (.m).
// File.h
extern int const foo;
następnie
// File.m
int const foo = 42;
Rozważ użycie enum
jeżeli to nie tylko jeden, ale wiele stałe należące razem
klas Objective C nie obsługują stałych członków. Nie możesz stworzyć stałej tak, jak chcesz.
Najbliższym sposobem deklarowania stałej związanej z klasą jest zdefiniowanie metody klasy, która ją zwraca. Możesz również użyć polecenia extern, aby uzyskać bezpośredni dostęp do stałych. Oba są przedstawione poniżej:
// 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
Zaletą wersji metoda klasy jest to, że może on zostać przedłużony, aby zapewnić stałe obiekty dość łatwo. Możesz użyć zewnętrznych obiektów, nakrętki musisz zainicjować je w metodzie initialize (chyba że są to ciągi znaków). Tak często można zobaczyć następujący wzór:
// 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
Prostym sposobem na typ wartości stałych takich liczb jest użycie enum hack jak zasugerował przez unbeli.
// File.h
enum {
SKFoo = 1,
SKBar = 42,
};
Jedną z zalet tego nad użyciem extern
jest to, że wszystko jest rozwiązany w czasie kompilacji, więc nie jest potrzebna żadna pamięć do przechowywania zmiennych.
Inną metodą jest użycie static const
, co miało zastąpić hackowanie wyrażeń w C/C++.
// File.h
static const int SKFoo = 1;
static const int SKBar = 42;
Szybkie skanowanie przez nagłówków Apple pokazuje, że metoda wyliczenia Hack wydaje się być najlepszym sposobem na osiągnięcie tego w Objective-C i faktycznie go znaleźć czystsze i używać go samodzielnie.
Ponadto, jeśli tworzysz grupy opcji, powinieneś rozważyć użycie NS_ENUM
do utworzenia stałych bezpiecznych.
// File.h
typedef NS_ENUM(NSInteger, SKContants) {
SKFoo = 1,
SKBar = 42,
};
Więcej informacji na NS_ENUM
i jego kuzyn NS_OPTIONS
jest dostępny na NSHipster.
Co jeśli potrzebuję 'typedef NS_ENUM'? – ManuQiao