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

102

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

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

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

Есть ли способ попроще?

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

Suragch
источник

Ответы:

206

Обновлено для Swift 4

Проверка того, чем строка начинается и заканчивается

Вы можете использовать hasPrefix(_:)и hasSuffix(_:)методы тестирования равенства с другой String.

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 String сложны, потому что они должны учитывать специальные символы (например, эмодзи). Однако, как только вы получите индекс, легко получить префикс или суффикс. (См мой другой ответ на 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

Дальнейшее чтение

Suragch
источник
5

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

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

Apple Doc

Гоби М
источник