Что означает «frozen» (замороженный) в контексте Swift/Foundation?

«Что означает «frozen» (замороженный) в контексте Swift/Foundation?» — вопрос из категории Swift Core, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

"Frozen" (замороженный) описывает состояние объекта, который становится неизменяемым (immutable). После заморозки любые попытки изменить объект (добавить, удалить или обновить элементы) приводят к ошибке времени выполнения.

Основные концепции и использование:

  • Оптимизация производительности: Неизменяемые коллекции могут быть оптимизированы компилятором и безопасно использоваться в многопоточном коде без блокировок.
  • Безопасность потоков: Замороженный объект можно безопасно передавать между потоками, так как его состояние гарантированно не изменится.

Пример с NSArray (Foundation):

import Foundation

var mutableArray: NSMutableArray = [1, 2, 3]
mutableArray.add(4) // Успешно, объект изменяемый

let frozenArray: NSArray = mutableArray // Приведение к NSArray "замораживает" его
// frozenArray.add(5) // КРАШ: "Attempt to mutate immutable object"

Где встречается:

  1. Combine / SwiftUI: Некоторые издатели (Publisher) могут предоставлять "замороженные" неизменяемые снэпшоты данных.
  2. Фреймворки Foundation: Классы вроде NSUserDefaults или NSCache могут возвращать замороженные копии данных для безопасности.
  3. Swift Evolution: Существует атрибут @frozen для перечислений, который гарантирует, что их набор кейсов не изменится в будущем, позволяя компилятору проводить дополнительные оптимизации.

Важно: "Frozen" не создает глубокую копию объекта. Он делает неизменяемой ссылку на существующие данные.