2012-02-29 22 views
5

Ho alcuni UIPopoverViewControllers che eseguono la messaggistica per delegare UIViewControllers per passare gli eventi dell'interfaccia utente. Invece di scrivere un metodo separato per ogni evento, ho un metodo nel delegato con un'istruzione switch che determina come gestire l'evento in base a una costante passata (esempio sotto).come condividere costanti (enumerazioni) tra le classi?

Questo è probabilmente un design scadente, ma è quello che mi è venuto in mente. Ho visto la domanda this riguardante enumerazioni o classi statiche ma non ho capito le risposte.

Quindi, ecco cosa sto facendo BAD e c'è un modo per definire l'enumerazione in un posto in modo che non debba mantenere più bit di codice che possono facilmente uscire dalla sincronizzazione?

EDIT Va bene, scavare intorno un po 'di più (+ herehere) vedo che potrei essere sulla strada giusta. Quindi suppongo di aver bisogno di sapere cosa e dove un file implementation è in iOS.

enum { 
kSetPlaybackType = 0, 
kSetAllNotesOn, 
kSetAllNotesOff, 
kSetVelocity, 
kSetDuration 
}; 

- (void)barPropertyAction:(int)action withParam:(NSNumber *)param 
{ 
switch (action) { 
    case kSetPlaybackType: 
     playbackType = [param intValue]; 
     if (playbackType == kPalindrome){ 
      palindromeDirection = kPalindromeUp; 
     } 
     break; 

    case kSetAllNotesOn: 
     for (BarNote* note in self.barNoteArray) { 
      note.noteOn = YES; 
     } 
     [self.bar updateWindows]; 
     break; 

    case kSetAllNotesOff: 
     for (BarNote* note in self.barNoteArray) { 
      note.noteOn = NO; 
     } 
     [self.bar updateWindows]; 
     break; 

    case kSetVelocity: 
     for (BarNote* note in self.barNoteArray) { 
      note.velocity = [param intValue]; 
     } 
     break; 

    case kSetDuration: 
     for (BarNote* note in self.barNoteArray) { 
      note.duration = [param floatValue]; 
     } 
     break; 

    default: 
     break; 
} 
} 

risposta

14

Non ho intenzione di dire che il vostro approccio è che è male, ma ha una leggera sensazione di esso dell'embrione di partenza di un metodo di "Dio" - che è un metodo che cerca di fare qualunque cosa. Comunque per il numero di scelte che hai nel codice direi che è perfettamente a posto.

Ma condividere l'enumerazione è molto semplice. Basta inserirli nel proprio file .h e importarlo dove è necessario. È possibile includere un file .h come uno dei tipi di file nella sezione "C & C++".

La domanda a cui si faceva riferimento era basata su C# e una cosa che facevano in quel linguaggio era progettare l'equivalente di file .h, e usare semplicemente le istruzioni "using" per individuare i simboli corretti. In Objective-C (come in C e C++) devi fare un po 'più di lavoro manuale per ottenere la stessa cosa.

A proposito, vorrei vestire l'enum leggermente più come:

typedef enum { 
    kSetPlaybackType = 0, 
    kSetAllNotesOn, 
    kSetAllNotesOff, 
    kSetVelocity, 
    kSetDuration 
} SetEnumType; 

Dichiarando l'enumerazione in un typedef, si guadagna la possibilità di dichiarare le variabili di quel tipo. Vale a dire, invece di:

int varName = kSetAllNotesOn; 

Si può dire:

SetEnumType varName = kSetAllNotesOn; 

Questo dà suggerimenti aggiuntivi per XCode quando si presenta con le scelte di completamento automatico, e rende semanticamente meglio leggere come una persona, come sapete che varName è destinato a contenere un enum e non solo qualsiasi vecchio numero.

Lo svantaggio è che potrebbe essere necessario eseguire il cast esplicito di varNum tra il tipo enum e il tipo int a seconda di ciò che si sta facendo.

Tuttavia io non sono sicuro se è possibile dichiarare la propria firma Metodo

- (void)barPropertyAction:(SetEnumType)action withParam:(NSNumber *)param 

Sono indovinando si dovrebbe essere in grado di (come credo che l'enumerazione è supportato da un int).Ma se non è possibile, allora si sarebbe stato meglio fare

- (void)barPropertyAction:(int)action withParam:(NSNumber *)param 
{ 
switch ((SetEnumType)action) { 
    case kSetPlaybackType: 
     playbackType = [param intValue]; 
+0

Inoltre, una delle cose che dobbiamo fare è nominare l'enum utilizzando un 'typedef' e che non utilizzano' int' come parametro, quando un l'enum specificato è previsto. – Sulthan

+0

@Sulthan Lo stavo facendo mentre commentavi: D –

+0

Questo è fantastico - grazie! Ho aggiunto il typedef + nome costante e ho spostato gli enum def in un file .h. È stato in grado di utilizzare il typedef nel mio metodo sig. '- (void) barPropertyAction: (kBarProperty) action withParam: (NSNumber *) param;' –

Problemi correlati