Тримминг строк в Swift: есть ли метод trim() у String?

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

«А где же мой .trim()?» — или почему Swift не Python

Если вы пришли в Swift из Python или JavaScript, то наверняка привыкли к простому вызову " hello ".trim() или " hello ".strip(). И вот вы пишете свой первый код на Swift, пытаетесь сделать то же самое — и получаете ошибку компиляции. Знакомая ситуация?

На Stack Overflow этот вопрос набрал тысячи просмотров, и не зря. В Swift нет метода .trim() у строки. Но это не значит, что обрезать пробелы и символы нельзя. Просто подход другой — более Swift-way. Давайте разберёмся раз и навсегда.

В этой статье мы не только ответим на главный вопрос, но и покажем реальные примеры кода, которые вы сможете сразу вставить в свой проект. Поехали!

Краткий ответ: да, но не так, как вы привыкли

В Swift нет единого метода .trim(). Вместо него используется семейство методов из протокола Foundation:

  • trimmingCharacters(in:) — основной инструмент
  • .trimmingCharacters(in: .whitespacesAndNewlines) — самый популярный вариант

Звучит немногословно? На деле это даёт гибкость: вы сами решаете, какие именно символы хотите обрезать, а не полагаетесь на «магию» встроенного метода.

Как работает trimmingCharacters — разбор на примерах

Базовый пример: удаление пробелов и переносов строк

import Foundation

let text = "   Привет, Swift!   \n"
let trimmed = text.trimmingCharacters(in: .whitespacesAndNewlines)
print(trimmed) // "Привет, Swift!"

Обратите внимание: мы обязаны импортировать Foundation. Без него метод недоступен, так как он определён в NSString, который «подмешивается» к Swift-строке через мост.

Только пробелы (без удаления переносов строк)

let textWithNewline = "  Hello\n"
let onlySpacesTrimmed = textWithNewline.trimmingCharacters(in: .whitespaces)
print(onlySpacesTrimmed) // "Hello\n"

Видите? Перенос строки остался. Это удобно, когда вы хотите сохранить форматирование, но убрать лишние пробелы по краям.

Обрезка произвольных символов

В CharacterSet можно передать любой набор:

let email = "  user@example.com  "
let cleaned = email.trimmingCharacters(in: .whitespaces)
print(cleaned) // "user@example.com"

let price = "$99.99"
let noDollar = price.trimmingCharacters(in: CharacterSet(charactersIn: "$"))
print(noDollar) // "99.99"

А что насчёт trimLeft / trimRight (ltrim / rtrim)?

В Python есть .lstrip() и .rstrip(). В Swift — нет. Но это легко реализовать вручную. Вот два простых расширения, которые вы можете добавить в свой проект:

import Foundation

extension String {
    func trimmingLeft(in characterSet: CharacterSet = .whitespacesAndNewlines) -> String {
        var start = startIndex
        while start < endIndex, characterSet.contains(self[start].unicodeScalars.first!) {
            formIndex(after: &start)
        }
        return String(self[start..<endIndex])
    }
    
    func trimmingRight(in characterSet: CharacterSet = .whitespacesAndNewlines) -> String {
        var end = endIndex
        while end > startIndex, characterSet.contains(self[index(before: end)].unicodeScalars.first!) {
            formIndex(before: &end)
        }
        return String(self[startIndex..<end])
    }
}

// Пример использования:
let text = "   Hello World   "
print(text.trimmingLeft())  // "Hello World   "
print(text.trimmingRight()) // "   Hello World"

Теперь у вас есть полноценные trimLeft и trimRight, как в любимом Python. Сохраните этот код в отдельный файл — пригодится.

Почему Swift не добавил простой .trim()?

Хороший вопрос. Причина — в философии языка:

  • Явность лучше неявности: вы должны точно указать, что обрезаете. .whitespaces? .whitespacesAndNewlines? Или, может, только точки и запятые?
  • Unicode и производительность: Swift-строки — это коллекции графем-кластеров (символов Unicode). Простой .trim() мог бы ввести в заблуждение относительно того, что именно обрезается.
  • Совместимость с Objective-C: метод пришёл из NSString, где уже была принята такая сигнатура.

Понимание этого спасёт вас от многих ошибок в будущем.

Жизненные примеры: где это реально нужно

1. Парсинг пользовательского ввода

Представьте, что вы пишете форму регистрации. Пользователь ввёл " john@doe.com " с пробелами. Без обрезки — баги и ошибки валидации.

let userInput = "  john@doe.com  "
let email = userInput.trimmingCharacters(in: .whitespacesAndNewlines)
// Теперь email = "john@doe.com" — можно смело проверять

2. Чтение данных из файла или API

CSV-файлы, JSON, ответы сервера — везде могут быть лишние пробелы и переносы строк.

let csvLine = "  name, age, city  \n"
let cleanedLine = csvLine.trimmingCharacters(in: .whitespacesAndNewlines)
// "name, age, city"

3. Обработка текста с эмодзи и спецсимволами

CharacterSet корректно работает с Unicode:

let emojiText = "  😊 Привет! 😊  "
let trimmedEmoji = emojiText.trimmingCharacters(in: .whitespaces)
print(trimmedEmoji) // "😊 Привет! 😊"

Эмодзи не обрезаются, так как они не входят в .whitespaces. Идеально.

Сравнение с Python strip() — таблица для быстрой справки

Если вы переходите с Python на Swift, вот шпаргалка:

Python Swift
" text ".strip() " text ".trimmingCharacters(in: .whitespacesAndNewlines)
" text ".lstrip() Расширение trimmingLeft() (см. выше)
" text

Блоги

Рекомендаций по книгам