Как проверить, что строка начинается с (префикс) или заканчивается (суффикс) в Swift
Я пытаюсь проверить, начинается ли строка Swift или заканчивается определенным значением. Эти методы не существуют:
var str = "Hello, playground"
str.startsWith("Hello") // error
str.endsWith("ground") // error
Я также хотел бы получить префикс и суффикс строки. Я мог бы найти подстроку, как отвечает здесь и здесь, но диапазоны-это такая боль в Swift.
есть ли более простой способ сделать это?
(я наткнулся на ответ, когда я читал документация, и с тех пор так ответ не подошел для моих поисковых запросов, я добавляю свои вопросы и ответы здесь.)
2 ответа:
обновлено для Swift 4
проверка того, что строка начинается и заканчивается
можно использовать
hasPrefix(_:)иhasSuffix(_:)методы проверки равенства с другой строкой.let str = "Hello, playground" if str.hasPrefix("Hello") { // true print("Prefix exists") } if str.hasSuffix("ground") { // true print("Suffix exists") }получение фактических подстрок префикса и суффикса
чтобы получить фактический префикс или суффикс подстроки, вы можете использовать один из следующих методов. Я рекомендую первый метод для его простоты. Все методы используют
strкакlet str = "Hello, playground"Способ 1: (Рекомендуется)
prefix(Int)иsuffix(Int)let prefix = String(str.prefix(5)) // Hello let suffix = String(str.suffix(6)) // groundэто лучший метод, на мой взгляд. В отличие от методов 2 и 3 ниже, этот метод не рухнет, если показатели выходят за пределы. Он просто вернет все символы в строке.
let prefix = String(str.prefix(225)) // Hello, playground let suffix = String(str.suffix(623)) // Hello, playgroundконечно, иногда сбои хороши, потому что они дают вам знать, что есть проблема с вашим кодом. Поэтому рассмотрим второй метод ниже. Оно будет выдаст ошибку, если индекс выходит за границы.
Способ 2:
prefix(upto:)иsuffix(from:)строковые индексы Swift сложны, потому что они должны учитывать специальные символы (например, emoji). Однако, как только вы получаете индекс, легко получить префикс или суффикс. (См.мой другой ответ on
String.Index.)let prefixIndex = str.index(str.startIndex, offsetBy: 5) let prefix = String(str.prefix(upTo: prefixIndex)) // Hello let suffixIndex = str.index(str.endIndex, offsetBy: -6) let suffix = String(str.suffix(from: suffixIndex)) // groundесли вы хотите, чтобы защитить от выхода за пределы, вы можете сделать индекс с помощью
limitedBy(опять же, см. ответ).Метод 3: индексы
поскольку String является коллекцией, вы можете использовать индексы для получения префикса и суффикса.
let prefixIndex = str.index(str.startIndex, offsetBy: 5) let prefix = String(str[..<prefixIndex]) // Hello let suffixIndex = str.index(str.endIndex, offsetBy: -6) let suffix = String(str[suffixIndex...]) // groundБолее Дальнеишее Чтение