Cómo comprobar con qué comienza una cadena (prefijo) o termina con (sufijo) en Swift

102

Estoy tratando de probar si una cadena Swift comienza o termina con un cierto valor. Estos métodos no existen:

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

También me gustaría obtener las cadenas de prefijo y sufijo. Podría encontrar una subcadena, como se responde aquí y aquí , pero los rangos son un dolor en Swift.

¿Existe una forma más sencilla de hacerlo?

(Me encontré con la respuesta cuando estaba leyendo la documentación , y dado que no apareció una respuesta SO para mis términos de búsqueda, estoy agregando mis preguntas y respuestas aquí).

Suragch
fuente

Respuestas:

204

Actualizado para Swift 4

Verificando con qué comienza y termina una cadena

Puede utilizar los métodos hasPrefix(_:)y hasSuffix(_:)para probar la igualdad con otra cadena.

let str = "Hello, playground"

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

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

Obtener las subcadenas de prefijo y sufijo reales

Para obtener el prefijo real o la subcadena de sufijo, puede utilizar uno de los siguientes métodos. Recomiendo el primer método por su simplicidad. Todos los métodos se utilizan strcomo

let str = "Hello, playground"

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

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

Este es el mejor método en mi opinión. A diferencia de los métodos 2 y 3 a continuación, este método no fallará si los índices se salen de los límites. Simplemente devolverá todos los caracteres de la cadena.

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

Por supuesto, a veces las fallas son buenas porque le permiten saber que hay un problema con su código. Así que considere también el segundo método a continuación. Lanzará un error si el índice se sale de los límites.

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

Los índices Swift String son complicados porque deben tener en cuenta caracteres especiales (como emoji). Sin embargo, una vez que obtiene el índice, es fácil obtener el prefijo o sufijo. (Vea mi otra respuesta en 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

Si desea protegerse contra salirse de los límites, puede hacer un índice usando limitedBy(nuevamente, vea esta respuesta ).

Método 3: subíndices

Dado que String es una colección, puede usar subíndices para obtener el prefijo y el sufijo.

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

Otras lecturas

Suragch
fuente
5

Igualdad de prefijo y sufijo

Para verificar si una cadena tiene un prefijo o sufijo de cadena en particular, llame a los métodos hasPrefix ( :) y hasSuffix ( :) de la cadena , los cuales toman un solo argumento de tipo String y devuelven un valor booleano.

Documento de Apple

Gobi M
fuente