Como verificar o que uma string começa com (prefixo) ou termina com (sufixo) em Swift

102

Estou tentando testar se uma string Swift começa ou termina com um determinado valor. Esses métodos não existem:

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

Também gostaria de obter as sequências de prefixo e sufixo. Eu poderia encontrar uma substring, como é respondido aqui e aqui , mas os intervalos são uma dor no Swift.

Existe uma maneira mais fácil de fazer isso?

(Me deparei com a resposta quando estava lendo a documentação e, como uma resposta do SO não apareceu para meus termos de pesquisa, estou adicionando minhas perguntas e respostas aqui.)

Suragch
fonte

Respostas:

204

Atualizado para Swift 4

Verificar com o que uma String começa e termina com

Você pode usar os métodos hasPrefix(_:)e hasSuffix(_:)para testar a igualdade com outra String.

let str = "Hello, playground"

if str.hasPrefix("Hello") { // true
    print("Prefix exists")
}

if str.hasSuffix("ground") { // true
    print("Suffix exists")
}

Obtendo o prefixo real e substrings de sufixo

Para obter o prefixo real ou substring de sufixo, você pode usar um dos seguintes métodos. Eu recomendo o primeiro método por sua simplicidade. Todos os métodos usam strcomo

let str = "Hello, playground"

Método 1: (recomendado) prefix(Int)esuffix(Int)

let prefix = String(str.prefix(5)) // Hello
let suffix = String(str.suffix(6)) // ground

Este é o melhor método na minha opinião. Ao contrário dos métodos 2 e 3 abaixo, este método não irá falhar se os índices saírem dos limites. Ele apenas retornará todos os caracteres da string.

let prefix = String(str.prefix(225)) // Hello, playground
let suffix = String(str.suffix(623)) // Hello, playground

Claro, às vezes as falhas são boas porque permitem que você saiba que há um problema com o seu código. Portanto, considere o segundo método abaixo também. Ele gerará um erro se o índice sair dos limites.

Método 2: prefix(upto:)esuffix(from:)

Os índices Swift String são complicados porque devem levar em consideração caracteres especiais (como emoji). No entanto, depois de obter o índice, é fácil obter o prefixo ou sufixo. (Veja minha outra resposta em 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

Se você quiser se proteger contra sair dos limites, pode fazer um índice usando limitedBy(novamente, veja esta resposta ).

Método 3: subscritos

Como String é uma coleção, você pode usar subscritos para obter o prefixo e o sufixo.

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

Leitura Adicional

Suragch
fonte
5

Igualdade de prefixo e sufixo

Para verificar se uma string tem um prefixo ou sufixo de string específico, chame os métodos hasPrefix ( :) e hasSuffix ( :) da string , ambos os quais recebem um único argumento do tipo String e retornam um valor booleano.

Apple Doc

Gobi M
fonte