Saltar al contenido

¿Cómo verifico si una cadena contiene otra cadena en Swift?

Solución:

Puede hacer exactamente la misma llamada con Swift:

Swift 4 y Swift 5

En Swift 4 String hay una colección de Character valores, no era así en Swift 2 y 3, por lo que puede usar este código más conciso1:

let string = "hello Swift"
if string.contains("Swift") {
    print("exists")
}

Swift 3.0+

var string = "hello Swift"

if string.range(of:"Swift") != nil { 
    print("exists")
}

// alternative: not case sensitive
if string.lowercased().range(of:"swift") != nil {
    print("exists")
}

Swift mayor

var string = "hello Swift"

if string.rangeOfString("Swift") != nil{ 
    println("exists")
}

// alternative: not case sensitive
if string.lowercaseString.rangeOfString("swift") != nil {
    println("exists")
}

Espero que esta sea una solución útil, ya que algunas personas, incluido yo, encontramos algunos problemas extraños al llamar containsString().1

PD. No te olvides de import Foundation

Notas al pie

  1. Solo recuerde que el uso de funciones de colección en Strings tiene algunos casos extremos que pueden brindarle resultados inesperados, por ejemplo, cuando se trata de emojis u otros grupos de grafemas como letras acentuadas.

Forma de extensión

Rápido 4

extension String {
    func contains(find: String) -> Bool{
        return self.range(of: find) != nil
    }
    func containsIgnoringCase(find: String) -> Bool{
        return self.range(of: find, options: .caseInsensitive) != nil
    }
}

var value = "Hello world"

print(value.contains("Hello")) // true
print(value.contains("bo"))    // false

print(value.containsIgnoringCase(find: "hello"))    // true
print(value.containsIgnoringCase(find: "Hello"))    // true
print(value.containsIgnoringCase(find: "bo"))       // false

Generalmente Swift 4 tiene un método de contenido, pero está disponible en iOS 8.0+


Swift 3.1

Puedes escribir extensión contains: y containsIgnoringCase por String

extension String { 

   func contains(_ find: String) -> Bool{
     return self.range(of: find) != nil
   }

   func containsIgnoringCase(_ find: String) -> Bool{
     return self.range(of: find, options: .caseInsensitive) != nil 
   }
 }

Versión Swift anterior

extension String {

    func contains(find: String) -> Bool{
       return self.rangeOfString(find) != nil
     }

    func containsIgnoringCase(find: String) -> Bool{
       return self.rangeOfString(find, options: NSStringCompareOptions.CaseInsensitiveSearch) != nil
     }
}

Ejemplo:

var value = "Hello world"

print(value.contains("Hello")) // true
print(value.contains("bo"))    // false

print(value.containsIgnoringCase("hello"))    // true
print(value.containsIgnoringCase("Hello"))    // true
print(value.containsIgnoringCase("bo"))       // false

De los documentos, parece que llamar containsString() en una cadena debería funcionar:

El tipo String de Swift se conecta a la perfección con la clase NSString de Foundation. Si está trabajando con el marco Foundation en Cocoa o Cocoa Touch, la API de NSString completa está disponible para invocar cualquier valor de String que cree, además de las funciones de String descritas en este capítulo. También puede usar un valor de cadena con cualquier API que requiera una instancia de NSString.

Sin embargo, no parece funcionar de esa manera.

Si intentas usar someString.containsString(anotherString), obtendrá un error de tiempo de compilación que indica 'String' does not contain a member named 'containsString'.

Entonces, te quedan algunas opciones, una de las cuales es unir explícitamente tu String a Objective-C usando bridgeToObjectiveC() otros dos implican el uso explícito de un NSString y el último consiste en lanzar el String a una NSString

Al hacer un puente, obtendría:

var string = "hello Swift"
if string.bridgeToObjectiveC().containsString("Swift") {
    println("YES")
}

Al escribir explícitamente la cadena como un NSString, obtendrías:

var string: NSString = "hello Swift"
if string.containsString("Swift") {
    println("YES")
}

Si tiene un String, puede inicializar un NSString desde él usando NSString (string :):

var string = "hello Swift"
if NSString(string: string).containsString("Swift") {
    println("YES")
}

Y finalmente, puedes lanzar un existente String a una NSString como a continuación

var string = "hello Swift"
if (string as NSString).containsString("Swift") {
    println("YES")
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *