Ответ
Основное место хранения — куча (heap). String в Swift — это тип-значение с семантикой Copy-on-Write (CoW).
Принцип Copy-on-Write: Несколько переменных могут указывать на один буфер в памяти, пока строки не изменяются. Копирование происходит только при модификации.
var original = "Hello" // Буфер создается в куче.
var copy = original // Копирования НЕТ. Обе переменные ссылаются на один буфер.
copy.append(", World!") // ТЕПЕРЬ создается отдельная копия буфера для `copy`.
print(original) // "Hello" (не изменилась)
Оптимизации:
- Small String Optimization (SSO): Строки длиной до 15 UTF-8 символов (на 64-битных платформах) могут храниться непосредственно в самом значении
String(в стеке для локальных переменных), без выделения памяти в куче. - Эффективное копирование: Благодаря CoW присваивание строк выполняется за O(1).
Практический вывод:
- Не нужно бояться передачи или возврата
Stringиз-за производительности. - Для частых модификаций больших строк используйте
var. - Для строк-констант предпочтительнее
let, чтобы компилятор мог применить дополнительные оптимизации.