Локальная переменная
Суть
Локальная переменная объявлена внутри функции, метода, замыкания или блока (if, for, do). Она существует только пока выполняется этот блок и не видна снаружи. Это самый безопасный вид состояния: его не может изменить никто, кроме кода рядом.
Как это работает в Swift
- Область видимости — ближайшие фигурные скобки. Внутренний блок может объявить переменную с тем же именем (shadowing);
if let x = x— идиома на этом же принципе. - Память: обычно кадр стека; освобождается автоматически при выходе из функции, ARC для value types не нужен. Если переменную захватило escaping-замыкание, компилятор переносит её в кучу (boxing), чтобы она пережила функцию.
letпо умолчанию: компилятор предупредит, еслиvarни разу не изменилась. Неизменяемые локальные переменные легче читать и безопасны при передаче вTask.- Инициализация обязательна до первого чтения — компилятор следит за этим (definite initialization), поэтому «мусорного» значения, как в C, быть не может.
func total(of prices: [Double]) -> Double {
var sum = 0.0 // живёт только внутри этого вызова
for p in prices {
let withTax = p * 1.2 // область видимости — тело цикла
sum += withTax
}
return sum
} // sum и withTax больше не существуют
func makeCounter() -> () -> Int {
var count = 0 // захвачена замыканием → переезжает в кучу
return { count += 1; return count }
}
let next = makeCounter()
print(next(), next()) // 1 2
Локальная vs глобальная vs свойство
- Локальная — короткое время жизни, нет гонок, нет скрытых зависимостей.
- Свойство — живёт столько, сколько экземпляр; доступно всем методам типа.
- Глобальная — живёт всё время работы программы; в Swift 6 изменяемая требует изоляции.
Правило: держите состояние в самой узкой области, где оно нужно. Если переменная нужна двум методам — это свойство; если одному — локальная.
На что смотрит интервьюер
Понимаете ли вы захват переменных замыканиями: count в примере выше — одна и та же переменная при каждом вызове, а не копия, потому что замыкание держит ссылку на её box. Это основа вопросов про [weak self] и capture list.