Подстановка в строку
В прошлом уроке число попадало в текст через String(…) и +. Это работает, но строка быстро обрастает кавычками и плюсами.
А собирать такие строки приходится постоянно. Почти каждое приложение показывает текст с числами и именами внутри: «Осталось 5 минут», «Анна, у вас 3 новых сообщения». Значения меняются, а фраза вокруг них остаётся той же.
Представьте бланк открытки: «Привет, ___! Тебе ___ лет». Текст на нём напечатан заранее, а в пропуски вписывают имя и возраст того, кому открытку отправят. В 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:
- Первый склеивает четыре части через
+, а числоageсначала превращает в текст черезString(age). - Второй записывает ту же фразу одной строкой. На месте
\(name)и\(age)Swift вписывает значения констант. - Оба печатают
Hi, Anna! Age: 30, но вторая запись короче, и в ней сразу видно, как будет выглядеть фраза.
Пропуск \( )
Интерполяция строк — это подстановка значений в строку через пропуски \( ). Пропуск \(age) устроен так:
- обратная косая черта
\говорит Swift, что дальше идёт не текст, а пропуск; - в скобках стоит то, что нужно вписать, например имя константы;
- закрывающая скобка заканчивает пропуск, и дальше снова идёт текст.
Без обратной косой черты скобки останутся обычным текстом: print("Hi, (name)!") напечатает Hi, (name)!.
Swift сам превращает в текст значение любого типа: Int, Double, Bool или Character. Писать String(…) внутри пропуска не нужно.
Выражение в пропуске
В пропуске может стоять не только имя, но и любое выражение: запись вроде age + 1 или price * 2, которую можно вычислить. Swift сначала вычисляет его, а потом вписывает результат:
let price = 2.5
print("Next year: \(age + 1)") // Next year: 31
print("Two cost \(price * 2)") // Two cost 5.0- В
\(age + 1)Swift складывает30и1и вписывает31. - В
\(price * 2)он умножает2.5на2. Результат имеет типDouble, поэтому в текст попадает5.0, вместе с дробной частью.
Здесь картинка с открыткой перестаёт работать. В пропуск открытки вписывают готовое слово, а в \( ) можно написать вычисление: Swift посчитает его и впишет только результат.
Зато в другом открытка точна: её заполняют один раз. Swift вписывает значения в тот момент, когда программа доходит до строки кода с \( ). Если переменная потом изменится, готовый текст останется прежним.
Частая ошибка
Число приклеили к тексту через +:
print("Age: " + age) // ✗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(…).