objective c - ¿Cómo se usa `typedef NS_ENUM` para devolver los valores` float`?
objective-c enums (2)
En Swift puedes usar type double para enums
enum Constants: Double {
case π = 3.14159
case e = 2.71828
case φ = 1.61803398874
case λ = 1.30357
}
Para saber mucho sobre el uso práctico de las enumeraciones en swift, consulte https://appventure.me/2015/10/17/advanced-practical-enum-examples/
En el código (a continuación ) LINE_WIDTH
se declara typedef
para la enumeración, donde los nombres Large, Medium, Small y Hairline son constantes int
.
typedef NS_ENUM(NSInteger, LINE_WIDTH)
{
LINE_WIDTH_Large,
LINE_WIDTH_Medium,
LINE_WIDTH_Small,
LINE_WIDTH_Hairline
};
¿Cómo puedo usar estos valores int
para devolver los valores float
de Large (1.5), Medium (1.0), Small (0.5) y Hairline (0.25)?
NOTA: una versión más simple de mi publicación anterior que no llevó a ninguna parte a pesar de esto y esto
Objective-C no admite valores enum no enteros. Su única opción es proporcionar un código que convierta el valor enum en un valor float
.
Una opción es crear una función simple como:
float LINE_WIDTH_float(LINE_WIDTH width);
Ponlo en la misma .h que la declaración enum. A continuación, agregue lo siguiente a algún archivo .m o .c apropiado:
float LINE_WIDTH_float(LINE_WIDTH width) {
switch (width) {
case LINE_WIDTH_Large:
return 1.5f;
case LINE_WIDTH_Medium:
return 1.0f;
case LINE_WIDTH_Small:
return 0.5f;
case LINE_WIDTH_Hairline:
return 0.25f;
default:
return 0.0f;
}
}
Entonces, en algún lugar tienes un valor enum:
LINE_WIDTH someWidth = LINE_WIDTH_Medium;
float width = LINE_WIDTH_float(someWidth);
Otra opción sería definir una matriz de float
.
En el mismo .h como enum add:
extern float *LINE_WIDTH_float;
Luego, en algunos .m o .c apropiados, puede agregar:
float *LINE_WIDTH_float = { 1.5, 1.0, 0.5, 0.25 };
Entonces para usar esto puedes hacer:
LINE_WIDTH someWidth = LINE_WIDTH_Medium;
float width = LINE_WIDTH_float[someWidth];
Tenga en cuenta que esto es menos seguro que el primer enfoque. Es probable que se cuelgue si su valor enum está configurado en algo distinto a un valor enum válido o si agrega un nuevo valor enum, pero se olvida de actualizar los valores en la matriz.