2011-08-31 21 views
8

Tengo una pregunta relacionada con el diseño.¿por qué usar constantes de cadena frente a constantes enum?

que he visto que la clase UIApplication tiene este tipo de banderas:

UIKIT_EXTERN NSString *const UIApplicationDidEnterBackgroundNotification 
UIKIT_EXTERN NSString *const UIApplicationWillEnterForegroundNotification 
UIKIT_EXTERN NSString *const UIApplicationDidFinishLaunchingNotification; 
UIKIT_EXTERN NSString *const UIApplicationDidBecomeActiveNotification; 
UIKIT_EXTERN NSString *const UIApplicationWillResignActiveNotification; 
UIKIT_EXTERN NSString *const UIApplicationDidReceiveMemoryWarningNotification; 

y, por otro lado, la clase declara UITableView estructuras como:

typedef enum { 
    UITableViewScrollPositionNone,   
    UITableViewScrollPositionTop,  
    UITableViewScrollPositionMiddle, 
    UITableViewScrollPositionBottom 
} UITableViewScrollPosition; 

Uno es para notificaciones y el otro define tipos de objetos. Creo que esas dos son opciones de diseño para 'etiquetar' algunos objetos relacionados y hacer las sentencias en tiempo de ejecución en función de esa bandera.

Digamos que quiero crear una fábrica de objetos que necesitan ser etiquetados. En la imagen de abajo, quiero enumeraciones o identificaciones para cada sección y widget. ¿Cómo se comunicaría un widget o 'invocaría' a otro? e.j. [[Containter sharedInstance] presentWidget: ?? forSection: ?? withInfo: (id) información];

enter image description here

¿Existe una razón más profunda o más precisa que elegir uno de ellos? Gracias por su ayuda.

+0

tenga en cuenta que la primera será una 'colección' de cadenas, donde la segunda será una selección de enteros (comenzando @ 0) – KevinDTimm

+0

Junto con lo que dijo Kevin, no creo que pueda hacer una enumeración de cadenas. Los mensajes son geniales para agrupar etiquetas. En mi empresa, generalmente establecemos explícitamente los valores enum en caso de que decidamos eliminar un valor enum más adelante.Algunos códigos que persisten pueden usar el valor enum para indicar el estado; sin embargo, si carga una nueva versión de la aplicación y se elimina un valor, esto afectará a todos los valores en la enumeración a menos que se especifiquen explícitamente. – Sam

+0

Una cosa que me viene a la mente es que, con cadenas de caracteres, no es necesario conocer la interfaz del objeto que recibirá estas cadenas. Con enumeraciones, cada objeto implicado conocería la interfaz de receptores ... ¿estoy en lo cierto? – chuckSaldana

Respuesta

8

Una declaración enum es no una estructura, la sintaxis es similar pero simplemente define una serie de números con nombre.

Estas constantes se refieren a dos tipos diferentes de tipos de datos, cadena frente a numérica.

Las constantes con nombre en UIApplications son punteros a objetos NSString , tienen un valor de puntero y también hay una cadena constante que apunten a (que se encuentra en el archivo .m). Algo así como declarar algunas constantes de cadena de este tipo (excepto que son extern y la definición se completa en otra parte):

NSString* const UIApplicationDidEnterBackgroundNotification = @"UIApplicationDidEnterBackgroundNotification"; 

Las constantes con nombre en UITableViewScrollPosition son nombres dados a número entero valores. Algo así como:

const int UITableViewScrollPositionNone = 0; 

La razón para usar una enumeración (números con nombre) en un caso es que se están definiendo todos los valores posibles frente a la constante de cadena que definen algunos de los valores, pero es posible que los usuarios para definir a los demás Con las constantes de cadena, cada biblioteca puede definir su propia sin posibilidad de duplicar las direcciones de cadena, mientras que definir extensiones a enumeraciones podría tener colisiones entre bibliotecas diferentes si definieran el mismo valor entero para tener diferentes significados.

+0

Puede hacer un argumento similar para el cambio de FourCharCodes (OSType y tal) a UTI: puede etiquetar algunos datos como '" com.bigco.document "' sin mucha preocupación de que alguien más ya esté usando ese identificador, pero al encontrar cuatro Los personajes romanos de Mac OS que nadie más ha reclamado (''BgCo''?) Son mucho más difíciles. Puede ampliar el rango del número para permitir más caracteres, pero todavía hay un límite superior artificial que no está presente cuando se usan identificadores de cadena. –

+0

Derecha. Obtendrá un error de enlazador si define dos constantes de cadena con el mismo nombre de identificador, no puede tener identificadores externos duplicados. Del mismo modo, no puede tener el nombre de dominio inverso duplicado, suponiendo que sean dominios reales registrados. – progrmr

0

parece que necesita una propiedad enum en el objeto. por lo que object.UITableViewScrollPosition

si declara constantes en su clase, no podrá cambiarlas para un objeto en particular.

Cuestiones relacionadas