Есть ли в Swift метод trim для строк, как в Java или C#?
Да, в 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) }
Такой подход даёт небольшой прирост производительности за счёт кэширования набора символов.