Перейти к содержимому
Теория · Переменные и типы · урок 6 из 7

Подстановка в строку

В прошлом уроке число попадало в текст через String(…) и +. Это работает, но строка быстро обрастает кавычками и плюсами.

А собирать такие строки приходится постоянно. Почти каждое приложение показывает текст с числами и именами внутри: «Осталось 5 минут», «Анна, у вас 3 новых сообщения». Значения меняются, а фраза вокруг них остаётся той же.

Представьте бланк открытки: «Привет, ___! Тебе ___ лет». Текст на нём напечатан заранее, а в пропуски вписывают имя и возраст того, кому открытку отправят. В Swift такой бланк — строка с пропусками \( ), и значение в каждый пропуск Swift вписывает сам.

Сравните два способа собрать одну и ту же фразу:

SWIFT
let name = "Anna"
let age = 30
print("Hi, " + name + "! Age: " + String(age))  // Hi, Anna! Age: 30
print("Hi, \(name)! Age: \(age)")  // Hi, Anna! Age: 30

Давайте разберём оба вызова print:

  1. Первый склеивает четыре части через +, а число age сначала превращает в текст через String(age).
  2. Второй записывает ту же фразу одной строкой. На месте \(name) и \(age) Swift вписывает значения констант.
  3. Оба печатают Hi, Anna! Age: 30, но вторая запись короче, и в ней сразу видно, как будет выглядеть фраза.

Пропуск \( )

Интерполяция строк — это подстановка значений в строку через пропуски \( ). Пропуск \(age) устроен так:

  • обратная косая черта \ говорит Swift, что дальше идёт не текст, а пропуск;
  • в скобках стоит то, что нужно вписать, например имя константы;
  • закрывающая скобка заканчивает пропуск, и дальше снова идёт текст.

Без обратной косой черты скобки останутся обычным текстом: print("Hi, (name)!") напечатает Hi, (name)!.

Swift сам превращает в текст значение любого типа: Int, Double, Bool или Character. Писать String(…) внутри пропуска не нужно.

Выражение в пропуске

В пропуске может стоять не только имя, но и любое выражение: запись вроде age + 1 или price * 2, которую можно вычислить. Swift сначала вычисляет его, а потом вписывает результат:

SWIFT
let price = 2.5
print("Next year: \(age + 1)")  // Next year: 31
print("Two cost \(price * 2)")  // Two cost 5.0
  1. В \(age + 1) Swift складывает 30 и 1 и вписывает 31.
  2. В \(price * 2) он умножает 2.5 на 2. Результат имеет тип Double, поэтому в текст попадает 5.0, вместе с дробной частью.

Здесь картинка с открыткой перестаёт работать. В пропуск открытки вписывают готовое слово, а в \( ) можно написать вычисление: Swift посчитает его и впишет только результат.

Зато в другом открытка точна: её заполняют один раз. Swift вписывает значения в тот момент, когда программа доходит до строки кода с \( ). Если переменная потом изменится, готовый текст останется прежним.

Частая ошибка

Число приклеили к тексту через +:

SWIFT
print("Age: " + age) // ✗
TEXT
error: binary operator '+' cannot be applied to operands of type 'String' and 'Int'

Знак + склеивает строку только со строкой, а age — это Int, и сам Swift число в текст не превратит. Подставьте число в пропуск, "Age: \(age)", или преобразуйте его: "Age: " + String(age).

Главное

  • \( ) внутри строки — пропуск, и Swift вписывает в него значение.
  • В пропуске может стоять выражение: \(age + 1) вписывает результат сложения.
  • Интерполяция сама превращает в текст значение любого типа: Int, Double, Bool.
  • + склеивает строку только со строкой, поэтому число подставляют через \( ) или String(…).