Атрибут @frozen в Swift применяется к перечислениям и структурам, чтобы сигнализировать, что их структура никогда не изменится в будущих версиях библиотеки.
Когда тип отмечен как @frozen, компилятор может делать более сильные предположения о его расположении в памяти и составе, что позволяет:
defaultНапример, переключение по @frozen перечислению выглядит так:
@frozen enum Direction { case north, south, east, west }
switch direction {
case .north: ...
case .south: ...
case .east: ...
case .west: ...
// Default не нужен — компилятор знает все кейсы
}
Swift поддерживает режим эволюции библиотеки (используется в SDK Apple), где типы могут получить новые кейсы или свойства в будущих релизах без нарушения уже скомпилированного кода. Это поведение по умолчанию для распространяемых библиотек.
Добавляя @frozen, автор библиотеки отказывается от этой гибкости:
@frozen перечисление@frozen структуру@frozen — гибко и безопасно для будущих изменений, но менее оптимизировано@frozen — максимальная производительность, но определение типа навсегда заблокированоИспользуй @frozen только когда ты уверен, что структура типа окончательна, так как это постоянный, публичный контракт со всеми потребителями твоей библиотеки.
В режиме library evolution в Swift типы, отмеченные @frozen, жертвуют бинарной совместимостью ради возможности добавлять новые случаи или свойства в будущих выпусках библиотеки.
Новый — ещё не проверен сообществом
Вы