Avatar ·

Как создать многострочную строку в Swift? Проблемы с переносами и экранированием

Всем привет! Я новичок в Swift и столкнулся с проблемой при создании длинных строк. Мне нужно сохранить текст с несколькими строками (например, адрес или описание товара), но обычные строки с кавычками не работают — компилятор ругается на перенос. Вот что я пробовал: ```swift let address = "ул. Ленина, д. 10 кв. 5 г. Москва" ``` Xcode выдает ошибку: "Unterminated string literal". Я понимаю, что в Swift нельзя просто переносить строку внутри кавычек. Но как тогда записать многострочный текст? Пробовал добавлять `\n` — это работает, но код становится нечитаемым, особенно если строк много. Еще я слышал про какие-то "raw strings" и три кавычки `"""`, но не уверен, как их правильно использовать. Например, если внутри текста есть кавычки или обратные слэши — они ломают строку. Подскажите, как грамотно работать с многострочными строками в 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. Массивы оставьте для случаев, когда строки приходят из переменных или баз данных.