Есть ли в Swift метод trim для обрезки пробелов у строки?
Краткий ответ: да, но метод называется иначе
В Swift нет метода trim() как в Java или JavaScript, но есть эквивалентный метод trimmingCharacters(in:). Он чуть более гибкий, так как позволяет указать, какие именно символы нужно удалить.
Основное решение
Для удаления пробелов и символов новой строки используйте предопределённый набор .whitespacesAndNewlines:
let userInput = " Привет, мир! \n"
let trimmed = userInput.trimmingCharacters(in: .whitespacesAndNewlines)
print(trimmed) // "Привет, мир!"
Разбор по частям
trimmingCharacters(in:)— метод экземпляра String, который возвращает новую строку без указанных символов в начале и конце..whitespacesAndNewlines— это статическое свойство типаCharacterSet, которое включает в себя:- Пробелы (обычный и неразрывный)
- Табуляцию
- Символы новой строки (\n, \r)
- Важно: метод не изменяет исходную строку, а возвращает новую. Строки в Swift — это value-типы.
Другие полезные наборы символов
Вы можете использовать разные CharacterSet в зависимости от задачи:
let text = " Hello, World! "
// Только пробелы (без переносов)
let noSpaces = text.trimmingCharacters(in: .whitespaces)
// Только символы пунктуации
let noPunctuation = "!!!Привет!!!".trimmingCharacters(in: .punctuationCharacters)
print(noPunctuation) // "Привет"
// Все символы, кроме букв и цифр
let alphanumeric = " abc123 ".trimmingCharacters(in: .alphanumerics.inverted)
print(alphanumeric) // "abc123"
Почему не .trim()?
Разработчики Swift решили сделать API более явным и гибким. Вместо одного жёсткого метода они предоставили универсальный trimmingCharacters(in:), который позволяет:
- Выбирать, какие символы удалять
- Использовать любые кастомные наборы символов
- Избегать путаницы с мутабельными/немутабельными операциями
Если нужно изменить исходную строку (мутация)
Для изменяемых переменных можно перезаписать значение:
var text = " Привет "
text = text.trimmingCharacters(in: .whitespaces)
print(text) // "Привет"
Создание собственного расширения для удобства
Если вам не хватает короткого метода, можно добавить его самостоятельно:
extension String {
func trimmed() -> String {
return self.trimmingCharacters(in: .whitespacesAndNewlines)
}
mutating func trim() {
self = self.trimmed()
}
}
let input = " Swift "
print(input.trimmed()) // "Swift"
var mutable = " Swift "
mutable.trim()
print(mutable) // "Swift"
Важные замечания
- Метод удаляет символы только в начале и конце строки, не затрагивая внутренние пробелы.
- Для удаления всех пробелов (включая внутренние) используйте
replacingOccurrences(of:with:). - Помните, что строки в Swift чувствительны к регистру, но
trimmingCharactersработает с символами, а не с текстом.
Теперь вы знаете, как правильно обрезать строки в Swift. Используйте trimmingCharacters(in: .whitespacesAndNewlines) как стандартный способ, аналогичный trim() в других языках.
Альтернативный подход: использование регулярных выражений
Хотя trimmingCharacters(in:) — самый простой и быстрый способ, в некоторых случаях может потребоваться более тонкий контроль. Например, нужно удалить не все пробелы, а только определённые их типы, или обрезать строку по шаблону.
Для этого можно использовать NSRegularExpression:
let text = " \n Hello, World! \n "
let pattern = "^[\\s]+|[\\s]+$"
let regex = try! NSRegularExpression(pattern: pattern)
let range = NSRange(location: 0, length: text.utf16.count)
let trimmed = regex.stringByReplacingMatches(
in: text,
range: range,
withTemplate: ""
)
print(trimmed) // "Hello, World!"
Здесь ^[\\s]+ — это все пробельные символы в начале строки, а [\\s]+$ — в конце. Регулярное выражение заменяет их на пустую строку.
Когда это может пригодиться?
- Если нужно удалить только табуляцию, но оставить обычные пробелы.
- Если нужно обрезать строку по определённому символу, например, удалить все точки в начале и конце.
- Если вы работаете с текстом, где стандартные
CharacterSetне подходят.
Недостатки
- Более сложный синтаксис.
- Медленнее, чем
trimmingCharacters(особенно на больших строках). - Требует обработки ошибок (try/catch).
Для 95% случаев используйте trimmingCharacters(in: .whitespacesAndNewlines). Регулярные выражения применяйте только тогда, когда стандартный метод не решает задачу.
Ответов пока нет.
Войдите чтобы оставить ответ