Как создать многострочную строку в Swift? Проблемы с переносами и экранированием
Использование многострочных строковых литералов (""" """)
В Swift, начиная с версии 4, появилась встроенная поддержка многострочных строк с помощью тройных кавычек """. Это самый простой и читаемый способ.
Вот как правильно переписать ваш пример:
let address = """
ул. Ленина, д. 10
кв. 5
г. Москва
"""
Важные правила:
- Открывающие кавычки
"""должны быть на отдельной строке, и сам текст начинается на следующей строке. - Закрывающие кавычки
"""тоже пишутся на отдельной строке. Отступ закрывающих кавычек определяет, сколько пробелов будет "обрезано" слева у всех строк внутри.
Управление отступами
Если вы пишете многострочную строку внутри функции или класса, удобно использовать отступы:
func getDescription() -> String {
let text = """
Это первая строка.
Это вторая строка с дополнительным отступом.
Это третья строка.
"""
return text
}
В этом примере закрывающие кавычки имеют 4 пробела отступа. Swift автоматически удалит эти 4 пробела из начала каждой строки. Если какая-то строка имеет больший отступ (как вторая), лишние пробелы сохранятся.
Экранирование символов внутри многострочных строк
По умолчанию внутри """ ... """ вам не нужно экранировать обратные слэши \ и одинарные кавычки '. Но двойные кавычки " всё ещё нужно экранировать как \".
Пример с кавычками внутри:
let quote = """
Он сказал: \"Swift — отличный язык!\"
И добавил: \'Это просто!\'
"""
Raw strings (расширенные разделители)
Если вам нужно избежать экранирования даже двойных кавычек, используйте синтаксис #""" """#. Чем больше знаков #, тем "сырее" строка:
let json = #"""
{
"name": "John",
"age": 30,
"quote": "Hello \"World\""
}
"""#
В этом случае все символы внутри интерпретируются буквально, включая двойные кавычки. Если внутри строки встретится """#, можно увеличить количество решёток: ##""" ... """##.
Интерполяция и перенос строк
Многострочные строки поддерживают интерполяцию (\(variable)):
let city = "Москва"
let index = 10
let fullAddress = """
г. \(city)
ул. Ленина, д. \(index)
кв. 5
"""
Когда использовать \n вместо многострочных строк
Если строка короткая и содержит всего один перенос, иногда проще использовать \n:
let short = "Строка 1\nСтрока 2"
Но для 3+ строк всегда предпочитайте """ — код становится намного читаемее.
Альтернативный подход: сборка строк через массив
Если по какой-то причине вы не можете использовать многострочные литералы (например, поддерживаете старую версию Swift до 4.0), можно собрать строку из массива с помощью joined(separator:):
let lines = [
"ул. Ленина, д. 10",
"кв. 5",
"г. Москва"
]
let address = lines.joined(separator: "\n")
print(address)
Этот способ также удобен, когда строки динамически генерируются или приходят из разных источников. Вы можете легко добавлять или удалять строки, не меняя форматирование всего текста.
Комбинированный подход: иногда полезно смешивать оба метода — использовать многострочный литерал для статической части и массив для динамической:
let staticPart = """
Основная информация:
"""
let dynamicLines = ["Строка 1", "Строка 2"]
let result = staticPart + dynamicLines.joined(separator: "\n")
Примечание: В современных проектах почти всегда стоит использовать """ — это быстрее, чище и соответствует стилю Swift. Массивы оставьте для случаев, когда строки приходят из переменных или баз данных.