Avatar ·

Есть ли в Swift метод trim для строк, как в Java или C#?

Всем привет! Я только начал изучать Swift после Java, и столкнулся с простой задачей: нужно удалить лишние пробелы и символы новой строки в начале и конце строки. В Java я бы написал `str.trim()`, в C# — `str.Trim()`. Но в Swift я не могу найти ничего похожего. Пробовал написать так: ```swift let text = " Привет, мир! \n" let trimmed = text.trim() // Ошибка: Value of type 'String' has no member 'trim' ``` Получаю ошибку компиляции. Поискал в документации — нашёл только `trimmingCharacters(in:)`, но он принимает какой-то `CharacterSet`, и я не понимаю, как его правильно использовать. Мне нужно просто убрать пробелы и переводы строк с обоих концов строки, как это делается в большинстве языков. Неужели в Swift для этого нужно писать свою функцию? Подскажите, пожалуйста, как правильно почистить строку от пробелов в начале и конце. Заранее спасибо! <<>>

Да, в Swift есть аналог trim — метод trimmingCharacters(in:)

В Swift нет отдельного метода trim(), но есть более гибкий подход через trimmingCharacters(in:). Для удаления пробелов и символов новой строки используется стандартный набор .whitespacesAndNewlines.

Вот как это работает:

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

Разбор примера:

  • .whitespacesAndNewlines — это предопределённый набор символов из CharacterSet, включающий пробелы, табуляции, символы новой строки и возврата каретки.
  • Метод trimmingCharacters(in:) возвращает новую строку, удаляя указанные символы с обоих концов.
  • Исходная строка не изменяется — метод возвращает новую строку (как и большинство методов работы со строками в Swift).

Другие полезные наборы CharacterSet

  • .whitespaces — только пробелы и табуляции (без переводов строк)
  • .newlines — только символы новой строки
  • .decimalDigits — десятичные цифры
  • .letters — буквы
  • .alphanumerics — буквы и цифры

Примеры использования

let dirty = "\n\t  Hello, World!  \n"

// Удаляем только пробелы (табуляции и переводы строк останутся)
let trimmedSpaces = dirty.trimmingCharacters(in: .whitespaces)
print(trimmedSpaces) // "\n\tHello, World!  \n"

// Удаляем только переводы строк
let trimmedNewlines = dirty.trimmingCharacters(in: .newlines)
print(trimmedNewlines) // "\n\t  Hello, World!  "

// Удаляем всё вместе
let trimmedAll = dirty.trimmingCharacters(in: .whitespacesAndNewlines)
print(trimmedAll) // "Hello, World!"

Создание своего CharacterSet

Вы можете задать произвольный набор символов для удаления:

let customSet = CharacterSet(charactersIn: ".,!? ")
let text = "!!! Привет, мир... "
let cleaned = text.trimmingCharacters(in: customSet)
print(cleaned) // "Привет, мир"

Важное замечание

В отличие от Java, метод trimmingCharacters(in:) удаляет символы только с начала и конца строки. Если нужно удалить все пробелы внутри строки, используйте replacingOccurrences(of:with:):

let spaced = "A   B   C"
let noSpaces = spaced.replacingOccurrences(of: " ", with: "")
print(noSpaces) // "ABC"

Или для замены множественных пробелов одним:

import Foundation

let messy = "Hello    World   Swift"
let cleaned = messy.replacingOccurrences(of: "\\s+", with: " ", options: .regularExpression)
print(cleaned) // "Hello World Swift"

Таким образом, в Swift нет одного метода trim(), но trimmingCharacters(in:) даёт гораздо больше контроля над тем, какие именно символы удалять.

<<>>

Расширение String для удобства (как в Java)

Если вам очень не хватает простого trim(), вы можете добавить его самостоятельно через расширение:

extension String {
    func trim() -> String {
        return self.trimmingCharacters(in: .whitespacesAndNewlines)
    }
    
    mutating func trimInPlace() {
        self = self.trim()
    }
}

// Использование:
let text = "   Привет   "
print(text.trim()) // "Привет"

var mutable = "\n  Swift  \n"
mutable.trimInPlace()
print(mutable) // "Swift"

Однострочник с Optional

Если строка может быть nil, можно использовать optional chaining:

let optionalText: String? = "  Hello  "
let trimmed = optionalText?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
print(trimmed) // "Hello"

Производительность

Метод trimmingCharacters(in:) работает быстро, но если вы вызываете его в цикле тысячи раз, лучшим решением будет создать CharacterSet один раз и переиспользовать его:

let whitespaceSet = CharacterSet.whitespacesAndNewlines
let results = strings.map { $0.trimmingCharacters(in: whitespaceSet) }

Такой подход даёт небольшой прирост производительности за счёт кэширования набора символов.