Я верю EventArgs.Empty
, используется для поддержания соглашения передачи спора с событием, даже если ни один не необходим.
Продавцы Mitchel отправили другую половину моей причины на полпути через мое сообщение: это предотвращает исключение нулевой ссылки, должен метод пытаться сделать что-то с тем аргументом (помимо проверки, если это является пустым).
EventArgs.Empty
в основном делает работу глобально определенного Аргумента События без дополнительной информации.
Для предоставления подобного примера поддержания соглашения, наше использование команды string.Empty
для инициализации строки, потому что в других отношениях различные кодеры могли бы использовать newString = ""; or newString = " "; or newString = null;
, все из которых могут привести к различным результатам для различных условий проверки.
А (немного педантичная) причина использовать EventArgs.Empty
по сравнению с new EventArgs()
состоит в том, что первый не инициализирует новое EventArgs
, сохраняя небольшой объем памяти.
Это действительно вопрос 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
и т. Д.) - это значения, которые можно присвоить этому типу.
Прежде всего, что касается FormatType.JSON: JSON не является членом FormatType, это возможно значение типа. FormatType даже не является составным типом - это скаляр.
Во-вторых, единственный способ сделать это - создать таблицу сопоставления. Более распространенный способ сделать это в Objective-C - создать серию констант, относящихся к вашим «символам», так что у вас будет NSString * FormatTypeJSON = @ «JSON»
и так далее.
Вы не можете сделать это легко. В 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])
.