Как разбить строку на массив подстрок в Swift?
Основные способы разбиения строки в Swift
В Swift есть два основных подхода: современный метод split(separator:) из стандартной библиотеки и метод components(separatedBy:) из Foundation. Рассмотрим оба.
1. Метод split(separator:) (рекомендуемый)
Этот метод возвращает массив подстрок типа [Substring]. Он эффективен и гибок:
let data = "apple,banana,grape,orange"
let result = data.split(separator: ",")
print(result) // ["apple", "banana", "grape", "orange"]
Важно: split возвращает [Substring]. Если нужен [String], преобразуйте:
let stringArray = result.map(String.init)
print(stringArray) // ["apple", "banana", "grape", "orange"]
Дополнительные параметры split
Метод поддерживает настройки:
- maxSplits — ограничение количества разделений:
let limited = data.split(separator: ",", maxSplits: 2)
print(limited) // ["apple", "banana", "grape,orange"]
true):let withEmpty = "a,,b,c".split(separator: ",", omittingEmptySubsequences: false)
print(withEmpty) // ["a", "", "b", "c"]
2. Метод components(separatedBy:) (Foundation)
Работает с String и возвращает [String], но требует импорта Foundation:
import Foundation
let data = "apple,banana,grape,orange"
let result = data.components(separatedBy: ",")
print(result) // ["apple", "banana", "grape", "orange"]
Особенности:
- Всегда возвращает
[String], не нужно преобразовывать. - Не удаляет пустые подстроки по умолчанию:
"a,,b".components(separatedBy: ",")вернёт["a", "", "b"]. - Может работать с
CharacterSet:
let numbers = "1 2,3;4".components(separatedBy: .whitespacesAndNewlines)
// ["1", "2,3;4"] — разделит только по пробелам
3. Разбиение по нескольким разделителям
Используйте CharacterSet с components:
import Foundation
let messy = "apple; banana,grape|orange"
let separators = CharacterSet(charactersIn: ";,|")
let result = messy.components(separatedBy: separators)
.map { $0.trimmingCharacters(in: .whitespaces) }
print(result) // ["apple", "banana", "grape", "orange"]
Какой способ выбрать?
- Для простых случаев — используйте
split(separator:). Он быстрее, не требует Foundation, даёт контроль над пустыми элементами. - Для работы с символами и множественными разделителями —
components(separatedBy:)сCharacterSet. - Для iOS/macOS приложений — оба варианта подходят, но
splitсчитается более «свифтовым».
Совет: если не уверены, начинайте с split(separator:) — это современная идиома Swift.
Альтернативный подход: Использование NSString методов
Хотя метод components(separatedBy:) из Foundation уже является обёрткой над NSString, вы можете напрямую использовать NSString, если работаете с Objective-C кодом или нужны специфические опции:
import Foundation
let data = "apple,banana,grape,orange"
let nsString = data as NSString
let result = nsString.components(separatedBy: ",")
print(result) // ["apple", "banana", "grape", "orange"]
Разбиение с помощью регулярных выражений
Для сложных шаблонов используйте NSRegularExpression:
import Foundation
let text = "apple123banana456grape"
let pattern = "\\d+"
let regex = try! NSRegularExpression(pattern: pattern)
let splits = regex.matches(in: text, range: NSRange(location: 0, length: text.utf16.count))
// Получите подстроки между числами с помощью ranges
Разбиение на отдельные символы
Если нужно разбить строку на отдельные символы:
let word = "Swift"
let characters = Array(word)
print(characters) // ["S", "w", "i", "f", "t"]
Этот подход полезен для посимвольной обработки, но помните: Character в Swift может состоять из нескольких Unicode-скаляров (например, эмодзи).