Как проверить, что строка начинается с (префикс) или заканчивается (суффикс) в Swift


Я пытаюсь проверить, начинается ли строка Swift или заканчивается определенным значением. Эти методы не существуют:

var str = "Hello, playground"
str.startsWith("Hello") // error
str.endsWith("ground") // error

Я также хотел бы получить префикс и суффикс строки. Я мог бы найти подстроку, как отвечает здесь и здесь, но диапазоны-это такая боль в Swift.

есть ли более простой способ сделать это?

(я наткнулся на ответ, когда я читал документация, и с тех пор так ответ не подошел для моих поисковых запросов, я добавляю свои вопросы и ответы здесь.)

2 68

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

Более Дальнеишее Чтение

равенство префикса и суффикса

чтобы проверить, имеет ли строка определенный префикс строки или суффикс, вызовите строку hasPrefix (:) и hasSuffix(:) методы, как которая принимает один аргумент типа String и возвращает логическое значение.

Apple Doc