Подтвердить что ты не робот

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
}

Будем рады услышать некоторые мысли об этом.

4b9b3361

Ответ 1

Я делаю то же самое, иногда, и вот почему.

С помощью структуры мои значения доступны прямо: поэтому, если SerializationKeys является структурой, то SerializationKeys.text является строкой.

Но с перечислением перечисление является значением. Если SerializationKeys является перечислением, то SerializationKeys.text не является строкой; это перечисление. Если я хочу строку, я должен ее явно получить, как enum rawValue. Иногда это просто слишком сумасшедший. С другой стороны, если это приемлемо, или если есть еще одна причина, почему это делает хорошее перечисление, то в порядке, я буду использовать перечисление.

Другими словами: если это просто прославленное пространство имен для некоторых констант, структура со статическими членами кажется простейшей. Перечисление относится к коммутатору, то есть к чему-то, что должно существовать в одном из нескольких возможных состояний.

Ответ 2

Причина Apple в выборе struct здесь кажется чисто смысловой. SerializationKeys.descriptionText является свойством. SerializationKey.DescriptionText - тип. И это отчасти семантически странно использовать тип в качестве ключа.

Правда, в этом конкретном случае тип SerializationKey.DescriptionText имеет связанное с ним "необработанное" значение. Но, как я понимаю, исходные значения действительно предназначены только для использования как своего рода слой "мостикового слоя" между C enums. Использование его для таких ключей вроде хачка.