Усі наведені нижче приклади використовують
var str = "Hello, playground"
Швидкий 4
Струни отримали досить великий капітальний ремонт у Swift 4. Коли зараз ви отримаєте деяку підрядку з String, ви отримаєте Substring
тип назад, а не a String
. Чому це? Рядки - це типові значення в Swift. Це означає, що якщо ви використовуєте одну рядок для створення нової, її потрібно скопіювати. Це добре для стабільності (ніхто більше не збирається змінювати її без вашого відома), але погано для ефективності.
З іншого боку, Підрядка - це посилання на початкову рядок, з якої вона вийшла. Ось зображення з документації, що ілюструє це.
Копіювання не потрібно, тому це набагато ефективніше використовувати. Однак уявіть, що ви отримали десять символів Substring з мільйона символів String. Оскільки Підрядка посилається на Рядок, система повинна буде триматися на всій Строці до тих пір, поки Підрядка буде навколо. Таким чином, щоразу, коли ви маніпулюєте своєю підрядкою, перетворіть її на рядок.
let myString = String(mySubstring)
Це скопіює лише підрядок, і пам'ять, що містить стару струну, може бути відтворена . Підрядки (як тип) мають бути короткочасними.
Ще одне велике вдосконалення Swift 4 полягає в тому, що струни - це колекції (знову ж таки). Це означає, що все, що ви можете зробити для колекції, ви можете зробити для String (використовувати підписки, повторити символи, фільтрувати тощо).
Наступні приклади показують, як отримати підрядку в Swift.
Отримання підрядків
Ви можете отримати підрядок з рядка за допомогою індексів або ряд інших методів (наприклад, prefix
, suffix
, split
). Ви все ще повинні використовувати, String.Index
а не Int
індекс для діапазону. (Дивіться мою іншу відповідь, якщо вам потрібна допомога з цим.)
Початок струни
Ви можете використовувати підписку (зверніть увагу на односторонній діапазон Swift 4):
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str[..<index] // Hello
або prefix
:
let index = str.index(str.startIndex, offsetBy: 5)
let mySubstring = str.prefix(upTo: index) // Hello
або навіть простіше:
let mySubstring = str.prefix(5) // Hello
Кінець рядка
Використання підписок:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str[index...] // playground
або suffix
:
let index = str.index(str.endIndex, offsetBy: -10)
let mySubstring = str.suffix(from: index) // playground
або навіть простіше:
let mySubstring = str.suffix(10) // playground
Зауважте, що при використанні suffix(from: index)
мені довелося відлік від кінця, використовуючи -10
. Це не обов'язково при простому використанні suffix(x)
, яке бере лише останні x
символи рядка.
Діапазон в рядку
Тут ми знову просто використовуємо підписки.
let start = str.index(str.startIndex, offsetBy: 7)
let end = str.index(str.endIndex, offsetBy: -6)
let range = start..<end
let mySubstring = str[range] // play
Перетворення Substring
наString
Не забувайте, коли ви готові зберегти свою підрядку, вам слід перетворити її на String
так, щоб можна було очистити стару пам'ять рядка.
let myString = String(mySubstring)
Використовуєте Int
розширення індексу?
Я вагаюся використовувати розроблене Int
на основі індексу ознайомлення, прочитавши статтю Strings in Swift 3 від Airspeed Velocity та Оле Бегемана. Хоча у Swift 4, Strings є колекціями, команда Swift спеціально не використовує Int
індекси. Це досі String.Index
. Це пов'язано з тим, що символи Swift складаються з різної кількості кодових точок Unicode. Фактичний індекс повинен бути однозначно обчислений для кожного рядка.
Треба сказати, я сподіваюся, що команда Свіфт знайде спосіб абстрагуватися String.Index
в майбутньому. Але до тих пір, поки я не вирішу використовувати їх API. Це допомагає мені пам'ятати, що маніпуляції з рядками - це не просто просте Int
пошуку індексів.