Struct или Enum использовать для ключей сериализации?
Есть ли причина, по которой Apple предпочитает использовать structs over enums в демонстрации Lister для объявления ключей для сериализации? Могут ли быть некоторые преимущества?
Например:
private struct SerializationKeys {
static let text = "text"
static let uuid = "uuid"
static let completed = "completed"
...
//duplicated key!
static let descriptionText = "text"
}
Здесь у нас могут быть потенциальные дубликаты для ключей. Это не большой вопрос для небольших объектов (не забудьте copy/paste:)), но для больших объектов с десятками полей это может быть реальной проблемой.
С перечислением у нас нет такой проблемы:
private enum SerializationKeys : String {
case text = "text"
case uuid = "uuid"
case completed = "completed"
//...
case descriptionText = "text"
//here we have compiler warning: Raw value for enum case is not unique
}
Будем рады услышать некоторые мысли об этом.
Ответы
Ответ 1
Я делаю то же самое, иногда, и вот почему.
С помощью структуры мои значения доступны прямо: поэтому, если SerializationKeys является структурой, то SerializationKeys.text
является строкой.
Но с перечислением перечисление является значением. Если SerializationKeys является перечислением, то SerializationKeys.text
не является строкой; это перечисление. Если я хочу строку, я должен ее явно получить, как enum rawValue
. Иногда это просто слишком сумасшедший. С другой стороны, если это приемлемо, или если есть еще одна причина, почему это делает хорошее перечисление, то в порядке, я буду использовать перечисление.
Другими словами: если это просто прославленное пространство имен для некоторых констант, структура со статическими членами кажется простейшей. Перечисление относится к коммутатору, то есть к чему-то, что должно существовать в одном из нескольких возможных состояний.
Ответ 2
Причина Apple в выборе struct
здесь кажется чисто смысловой. SerializationKeys.descriptionText
является свойством. SerializationKey.DescriptionText
- тип. И это отчасти семантически странно использовать тип в качестве ключа.
Правда, в этом конкретном случае тип SerializationKey.DescriptionText
имеет связанное с ним "необработанное" значение. Но, как я понимаю, исходные значения действительно предназначены только для использования как своего рода слой "мостикового слоя" между C enums. Использование его для таких ключей вроде хачка.