2010-03-04 12 views
12

Mam kilka klas obj-c, z których każda wymaga pewnej liczby stałych, które są używane w instrukcjach przełączania.Stałe klasy

Próbowałem już zdefiniować te stałe numeryczne w pliku .m przy użyciu instrukcji preprocesora #define. Wszystkie te stałe zaczynają się od "kCell". Wydaje się, że działa to dobrze, ale sens kodu Xcode pokazuje mi każdą stałą "kCell" bez względu na to, gdzie jestem w projekcie. Czy stałe mają zasięg globalny? Jeśli tak, jaki jest najlepszy sposób definiowania czysto lokalnych stałych klas, które nie będą klasy o podobnie nazwanych stałych w innych klasach?

Odpowiedz

34

mieć własną stałą plik jak MyConstants.

W MyConstants.h zadeklarować wszystkie swoje stałe:

static const int kRedisplayTileCount = 5 ; 
extern NSString* const kCellTitleKey; 

aw MyConstants.m je zdefiniować

NSString* const kCellTitleKey = @"CellTitle"; 

Utrzymując stałe w oddzielnym pliku, to będzie łatwe do prześledzenia i zmienić ich wartość.

Jest to najlepszy sposób definiowania czysto stałych. I to pozwoli uniknąć duplikatów kluczy również.

Tylko trzeba zrobić, to zaimportować tę klasę w was innych klas:

#import "MyConstants.h" 

i używać tych przycisków od razu:

obj = [[NSUserDefaults standardUserDefaults] integerForKey: kCellTitleKey]; 
+4

Konsekwentnie pisownia, podoba mi się to (MyConstatnts). – pauloya

+4

Można również umieścić plik #import "MyConstants.h" w pliku Prefix.pch, aby był dostępny ze wszystkich plików .m w projekcie. –

+0

Ale nie są to stałe klasowe. Co jeśli mam dwa pliki ClassA.h i ClassB.h i mam stały 'SomeErrorCode = 1' w ClassA.h i' SomeErrorCode = 2' w ClassB.h? Jak zapewnić, że w kodzie wywołującym mogę sprawdzić ClassA.SomeErrorCode i ClassB.SomeErrorCode i nadal uzyskać dwie różne wartości, ponieważ są one zdefiniowane w obu .h plików? – JustAMartin

5

Stałe #define istnieją tylko w pliku .m.

Jeśli stałe są liczbami całkowitymi można również definiować je w enum:

enum { 
    kCellSomething = 123, 
    kCellAnotherThing = 456, 
    ... 
}; 
1

To wydaje się działać dobrze, ale kod poczucie Xcode jest prezentując mi każdą stałą "kCell" bez względu na to, gdzie jestem w projekcie. Czy stałe #define mają zasięg globalny? Jeśli tak, jaki jest najlepszy sposób definiowania czysto lokalnych stałych klas, które nie będą klasy o podobnie nazwanych stałych w innych klasach?

Dostępność kodu Sense i Runtime kodu Xcode nie jest identyczna. Xcode oferuje także selectorNames i inne elementy przedmiotów, które nie są widoczne w środowisku uruchomieniowym.

Wszystko zdefiniowane w pliku .m jest lokalne w czasie wykonywania.

Mają również spojrzeć na to pytanie: Constants in Objective-C

8

ja generalnie uważają, że teksty stałe są najlepiej wykorzystywane do przełączników:

typedef enum { 
    kCellConstantOne = 1, 
    kCellConstantTwo = 2, //... 
} kCellConstants; 

/* later */ 
- (void)foo:(kCellConstant)constant { 
    switch (constant) { 
    case kCellConstantOne: 
     //do something 
     break; 
    case kCellConstantTwo: 
     //do something else 
     break; 
    } 
} 

Niestety Xcode nie ogranicza jego kod sens (uzupełniania kodu, auto -complete) do dowolnego określonego pliku. Próbuje ustalić, które stałe są dostępne, z których obszarów kodu, ale zauważyłem, że nie jest on w 100% dokładny.

Proponuję, aby nie uruchamiać wszystkich z tym samym prefiksem.Na przykład, jeśli masz dwa różne typy komórek tabeli, kCustomCell i kOtherCell mogą być lepszymi sposobami na nadanie ci stałych.