Swift:
Извлечение подстрок
Как:
Swift делает работу с подстроками довольно простой. Давайте сразу же перейдем к некоторым примерам.
let fullString = "Hello, Swift Programmer!"
let startIndex = fullString.index(fullString.startIndex, offsetBy: 7)
let endIndex = fullString.index(fullString.startIndex, offsetBy: 12)
// Извлечение подстроки с использованием String.Index
let substring = fullString[startIndex...endIndex]
print(substring) // "Swift"
// Другой способ, используя NSRange и NSString
import Foundation
let nsRange = NSRange(location: 7, length: 6)
if let range = Range(nsRange, in: fullString) {
let substring = fullString[range]
print(substring) // "Swift"
}
// Краткий способ, если вы знаете точные индексы
let quickSubstring = fullString[7...12]
print(quickSubstring) // Это вызовет ошибку, потому что строки в Swift не поддерживают индексацию целыми числами
Вывод:
Swift
Swift
// Ошибка: 'subscript(_:)' недоступен: нельзя индексировать String с помощью Int, смотрите документацию по String для получения дополнительной информации
Погружение
Извлечение подстрок в Swift включает в себя понимание того, как Swift управляет строками, что немного отличается от языков, таких как Python или C#. В Swift строки являются коллекциями символов, которые не используют целочисленные индексы. Это проистекает из поддержки Swift символов, совместимых с Unicode, делая строки не фиксированной длины, а скорее коллекцией графемных кластеров (то, что пользователь воспринимает как отдельный символ).
Этот дизайн означает, что прямая индексация целыми числами не работает со строками Swift; вам нужно работать с String.Index
. Хотя это и не так интуитивно понятно, как использование целых чисел, это обеспечивает согласованную работу с различными текстовыми скриптами и эмодзи.
Альтернативы включают использование NSString
из Objective-C, как показано в примерах, что позволяет использовать NSRange, но это довольно старомодно и не по-Swifty. Начиная с Swift 4, сама строка получила много улучшений, с богатым, более интуитивным набором API для работы с подстроками, оставив NSString
в прошлом для большинства задач.
Детали реализации критически важны — наивное извлечение подстрок может привести к снижению производительности, поскольку каждый вызов index(_: offsetBy:)
может быть O(n) при работе со строками, совместимыми с Unicode. Кроме того, когда вы создаете подстроку в Swift, она разделяет память исходной строки, что делает это эффективным, но это необходимо учитывать, если вы позже измените исходную строку.
Смотрите также
Для получения дополнительной информации по этой теме ознакомьтесь с официальной документацией:
- Swift String и Characters: https://docs.swift.org/swift-book/LanguageGuide/StringsAndCharacters.html
- Руководство по программированию строк: https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Strings/
Попрактикуйтесь и поэкспериментируйте в Swift playground, чтобы действительно разобраться в этом.