
Все следующие примеры использования
var str = "Hello, playground"
Swift 4
Строки получили довольно большой пересмотр в Swift 4. Когда вы получаете некоторую подстроку из String сейчас, вы получаете Substringтип назад, а не a String. Почему это? Строки являются типами значений в Swift. Это означает, что если вы используете одну строку для создания новой, то она должна быть скопирована. Это хорошо для стабильности (никто не собирается менять это без вашего ведома), но плохо для эффективности.
Подстрока, с другой стороны, является ссылкой на исходную строку, из которой она получена. Вот изображение из документации, иллюстрирующее это.

Копирование не требуется, поэтому его гораздо эффективнее использовать. Однако представьте, что вы получили Подстроку из десяти символов из Строки с миллионами символов. Поскольку Подстрока ссылается на Строку, системе придется удерживать всю Строку до тех пор, пока Подстрока находится рядом. Таким образом, всякий раз, когда вы закончите манипулировать своей подстрокой, преобразуйте ее в строку.
let myString = String(mySubstring)
Это скопирует только подстроку, и память, содержащая старую строку, может быть восстановлена . Подстроки (как тип) должны быть недолговечными.
Еще одно большое улучшение в Swift 4 заключается в том, что Strings являются коллекциями (опять же). Это означает, что все, что вы можете сделать с коллекцией, вы можете сделать со строкой (использовать индексы, перебирать символы, фильтровать и т. Д.).
В следующих примерах показано, как получить подстроку в 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расширение на основе индекса после прочтения статьи « Строки в Swift 3» от Airspeed Velocity и Оле Бегеманна. Хотя в Swift 4 строки являются коллекциями, команда Swift специально не использовала Intиндексы. Это все ещеString.Index . Это связано с тем, что символы Swift состоят из различного числа кодовых точек Unicode. Фактический индекс должен быть уникально рассчитан для каждой строки.
Должен сказать, я надеюсь, что команда Swift найдет способ отвлечься String.Indexв будущем. Но до них я выбираю использовать их API. Это помогает мне помнить, что манипуляции со строками - это не просто Intпоиск по индексу.