Все следующие примеры использования
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
поиск по индексу.