Как проверить, что строка начинается с (префикс) или заканчивается (суффикс) в 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
Более Дальнеишее Чтение