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
- 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")
}