2010-05-31 6 views

risposta

16

per le costanti "pubbliche", si dichiara come extern nel file di intestazione (h) e inizializzate nel vostro file di implementazione (.m).

// File.h 
extern int const foo; 

poi

// File.m 
int const foo = 42; 

considerare l'utilizzo di enum se non è solo uno, ma più costanti appartenenti insieme

+0

Cosa succede se ho bisogno di 'typedef NS_ENUM'? – ManuQiao

12

classi Objective C non supportano le costanti come membri. Non è possibile creare una costante nel modo desiderato.

Il modo più vicino per dichiarare una costante associata a una classe è definire un metodo di classe che lo restituisca. Puoi anche usare extern per accedere direttamente alle costanti. Entrambi sono illustrati di seguito:

// 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 

Un vantaggio della versione del metodo di classe è che può essere esteso per fornire oggetti costanti abbastanza facilmente. Puoi usare gli oggetti extern, nut devi inizializzarli in un metodo di inizializzazione (a meno che non siano stringhe). Così vedrete spesso il seguente schema:

// 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

Aggiunto un altro bit che ho appena pensato su – JeremyP

+0

bello. Potrebbe essere interessante specificare che il pattern che hai scritto è chiamato singleton ed è spesso usato per condividere cose in tutte le applicazioni. Un bell'esempio di dev di iPhone è la classe AppDelegate. – moxy

0

Un modo semplice per le costanti tipo di valore come gli interi è quello di utilizzare la enum hack come accennato dal unbeli.

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

Un vantaggio di questo rispetto all'utilizzo extern è che è tutto risolto al momento della compilazione quindi non è necessaria alcuna memoria per contenere le variabili.

Un altro metodo è quello di utilizzare static const che è quello che doveva sostituire l'enum hack in C/C++.

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

Una scansione rapida attraverso le intestazioni di Apple dimostra che il metodo enum trucco sembra essere il modo migliore di fare questo in Objective-C e io in realtà trovare più pulito e usarlo io stesso.

Inoltre, se si creano gruppi di opzioni, è consigliabile utilizzare NS_ENUM per creare costanti di tipo typesize.

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

Maggiori informazioni NS_ENUM ed è cugino NS_OPTIONS è disponibile presso NSHipster.

Problemi correlati