Преобразовать type-def target-c в его строковый эквивалент

Я верю EventArgs.Empty, используется для поддержания соглашения передачи спора с событием, даже если ни один не необходим.

Продавцы Mitchel отправили другую половину моей причины на полпути через мое сообщение: это предотвращает исключение нулевой ссылки, должен метод пытаться сделать что-то с тем аргументом (помимо проверки, если это является пустым).

EventArgs.Empty в основном делает работу глобально определенного Аргумента События без дополнительной информации.

Для предоставления подобного примера поддержания соглашения, наше использование команды string.Empty для инициализации строки, потому что в других отношениях различные кодеры могли бы использовать newString = ""; or newString = " "; or newString = null;, все из которых могут привести к различным результатам для различных условий проверки.

А (немного педантичная) причина использовать EventArgs.Empty по сравнению с new EventArgs() состоит в том, что первый не инициализирует новое EventArgs, сохраняя небольшой объем памяти.

138
задан craig 18 March 2015 в 01:54
поделиться

3 ответа

Это действительно вопрос C, а не специфический для Objective-C (который является надмножеством языка C). Перечисления в C представлены целыми числами. Итак, вам нужно написать функцию, которая возвращает строку с заданным значением перечисления. Есть много способов сделать это. Массив строк, такой, что значение перечисления может использоваться в качестве индекса в массиве или структуре карты (например, NSDictionary ), которая сопоставляет значение перечисления со строкой, работает, но я считаю, что эти подходы не так ясно, как функция, которая делает преобразование явным (и подход массива, хотя классический способ C опасен, если значения перечисления не совпадают с 0). Примерно так будет работать:

- (NSString*)formatTypeToString:(FormatType)formatType {
    NSString *result = nil;

    switch(formatType) {
        case JSON:
            result = @"JSON";
            break;
        case XML:
            result = @"XML";
            break;
        case Atom:
            result = @"Atom";
            break;
        case RSS:
            result = @"RSS";
            break;
        default:
            [NSException raise:NSGenericException format:@"Unexpected FormatType."];
    }

    return result;
}

Связанный с вами вопрос о правильном синтаксисе для значения перечисления заключается в том, что вы используете только значение (например, JSON ), а не синтаксис FormatType.JSON . FormatType - это тип, а значения перечисления (например, JSON , XML и т. Д.) - это значения, которые можно присвоить этому типу.

134
ответ дан 23 November 2019 в 23:23
поделиться

Прежде всего, что касается FormatType.JSON: JSON не является членом FormatType, это возможно значение типа. FormatType даже не является составным типом - это скаляр.

Во-вторых, единственный способ сделать это - создать таблицу сопоставления. Более распространенный способ сделать это в Objective-C - создать серию констант, относящихся к вашим «символам», так что у вас будет NSString * FormatTypeJSON = @ «JSON» и так далее.

]
1
ответ дан 23 November 2019 в 23:23
поделиться

Вы не можете сделать это легко. В C и Objective-C перечисления - это просто прославленные целочисленные константы. Вам придется сгенерировать таблицу имен самостоятельно (или с некоторыми злоупотреблениями препроцессора). Например:

// In a header file
typedef enum FormatType {
    JSON,
    XML,
    Atom,
    RSS
} FormatType;

extern NSString * const FormatType_toString[];

// In a source file
// initialize arrays with explicit indices to make sure 
// the string match the enums properly
NSString * const FormatType_toString[] = {
    [JSON] = @"JSON",
    [XML] = @"XML",
    [Atom] = @"Atom",
    [RSS] = @"RSS"
};
...
// To convert enum to string:
NSString *str = FormatType_toString[theEnumValue];

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

Также обратите внимание, что это предполагает, что у вас есть допустимая константа enum. Если у вас есть целочисленное значение из ненадежного источника, вам дополнительно необходимо выполнить проверку допустимости вашей константы, например, включив в перечисление значение «прошедшего максимума» или проверив, меньше ли оно длины массива, sizeof (FormatType_toString) / sizeof (FormatType_toString [0]) .

126
ответ дан 23 November 2019 в 23:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: