Как использовать `typedef NS_ENUM` для возврата значений` float`?

В коде (ниже) LINE_WIDTH объявлен typedef для перечисления, где имена Large, Medium, Small и Hairline являются константами int.

    typedef NS_ENUM(NSInteger, LINE_WIDTH)
    {
        LINE_WIDTH_Large,
        LINE_WIDTH_Medium,
        LINE_WIDTH_Small,
        LINE_WIDTH_Hairline    
    };

Как я могу использовать эти значения int для возврата значений float для больших (1.5), Medium (1.0), Small (0.5) и Hairline (0.25)?

ПРИМЕЧАНИЕ: более простая версия моего более раннего сообщения, в котором не было никого, несмотря на this и это

Ответ 1

Objective-C не поддерживает нецелые значения перечисления. Единственный вариант - предоставить код, который преобразует значение перечисления в значение float.

Один из вариантов - создать простую функцию, например:

float LINE_WIDTH_float(LINE_WIDTH width);

Поместите это в том же .h, что и объявление перечисления. Затем добавьте следующее в некоторые подходящие файлы .m или .c:

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;
    }
}

Итак, у вас есть значение перечисления:

LINE_WIDTH someWidth = LINE_WIDTH_Medium;
float width = LINE_WIDTH_float(someWidth);

Другим вариантом будет определение массива float.

В том же .h, что и перечисление add:

extern float *LINE_WIDTH_float;

Затем в некоторых подходящих .m или .c вы можете добавить:

float *LINE_WIDTH_float = { 1.5, 1.0, 0.5, 0.25 };

Затем для этого вы можете:

LINE_WIDTH someWidth = LINE_WIDTH_Medium;
float width = LINE_WIDTH_float[someWidth];

Обратите внимание, что это менее безопасно, чем первый подход. Вероятно, это сбой, если для вашего значения перечисления установлено значение, отличное от действительного значения перечисления, или если вы добавляете новое значение перечисления, но забудьте обновить значения в массиве.

Ответ 2

В Swift вы можете использовать тип double для перечислений

enum Constants: Double {
    case π = 3.14159
    case e = 2.71828
    case φ = 1.61803398874
    case λ = 1.30357
}

Чтобы узнать много о практическом использовании перечислений в swift, обратитесь https://appventure.me/2015/10/17/advanced-practical-enum-examples/