Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Дополнительная литература

Ответ 2

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

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

Apple Doc