Puede convertir ambos a minúsculas antes de hacer la comparación.
Dino Tw
8
Solo para tener en cuenta que lowercaseStringeso se menciona en algunas respuestas fallará en algunos idiomas (Straße! = STRASSE por ejemplo)
Alladiniano
@Alladiniano, ¿cómo sugerirías hacerlo entonces? La mayoría de los ejemplos para resolver este problema muestran la conversión a mayúsculas o minúsculas.
Steve
5
@Steve Apple sugiere caseInsensitiveCompare:y en su localizedCaseInsensitiveCompare:lugar
var a ="Cash"var b ="cash"let result:NSComparisonResult= a.compare(b, options:NSStringCompareOptions.CaseInsensitiveSearch, range:nil, locale:nil)// You can also ignore last two parameters(thanks 0x7fffffff)
//let result:NSComparisonResult= a.compare(b, options:NSStringCompareOptions.CaseInsensitiveSearch)
el resultado es el tipo de enumeración NSComparisonResult:
En Swift 3 necesitas usara.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
azhidkov
2
Nota: caseInsensitiveCompare(_:)no está incluido en la biblioteca estándar de Swift, sino que es parte del Foundationmarco, por lo que requiere import Foundation.
chrisamanse
¿Hay alguna razón por la que esto sea mejor que a.lowercased() == b.lowercased()?
jowie
36
caseInsensitiveCompareMétodo de uso :
let a ="Cash"let b ="cash"let c = a.caseInsensitiveCompare(b)==.orderedSame
print(c)//"true"
ComparisonResult le dice qué palabra viene antes que la otra en orden lexicográfico (es decir, cuál se acerca al principio de un diccionario). .orderedSamesignifica que las cadenas terminarían en el mismo lugar en el diccionario
que .orderedSamesignifica Los documentos solo dicen que los dos operandos son iguales . Pero, ¿por qué se usa aquí la palabra "orden"? ¿Hay una secuencia o algo así? ¿Y qué hace? El operando izquierdo es más pequeño que el operando derecho. ( .orderedAscending) significa para cadenas
Cariño
1
El resultado de @Honey Comparison le dice qué palabra viene antes que la otra en orden lexicográfico (es decir, cuál se acerca al principio de un diccionario). .orderedSamesignifica que las cadenas terminarían en el mismo lugar en el diccionario.
dasblinkenlight
1
@Honey .orderedSamees la abreviatura de ComparisonResult.orderSame... no es necesario que nombre el tipo ya que el compilador sabe que caseInsensitiveComparedevuelve un ComparisonResult. "Los dos operandos son iguales", son iguales según un orden específico ... claramente, "Efectivo" y "efectivo" no son valores de cadena idénticos. "¿Pero por qué se usa aquí la palabra 'orden'?" - porque es el resultado de una comparación ordenada. Los otros valores son orderedAscendingy orderedDescending... no es solo una cuestión de iguales o diferentes. En cuanto a "más pequeño": las cadenas son como números en una base grande.
Jim Balter
1
Siento que este es un diseño de API terrible. La firma no es fácil de leer ... Hacerla a.caseInsensitiveCompare(b, comparing: .orderedSame)habría sido más legible ...
Cariño
25
if a.lowercaseString == b.lowercaseString {//Strings match
}
Pure Swift es el camino a seguir aquí. No necesita base.
Alexander - Reincorporación a Monica
2
Convertir el caso y luego comparar es incorrecto. Vea los comentarios debajo de la pregunta.
Jim Balter
1
@JimBalter No diría que está "mal" ya que responde al ejemplo dado en la pregunta del OP. Para aquellos de nosotros que no necesitamos apoyar la localización, ¡esto es mucho más limpio!
toddg
4
^ No, está mal. Que algo suceda que funcione, por ejemplo, es irrelevante. Este truco no es "más limpio" en absoluto. La respuesta aceptada da la solución correcta y limpia.
Jim Balter
8
MANERA CORRECTA:
let a:String="Cash"let b:String="cash"if a.caseInsensitiveCompare(b)==.orderedSame {//Strings match
}
Tenga en cuenta: ComparisonResult.orderedSame también se puede escribir como .orderedSame en forma abreviada.
OTRAS MANERAS:
a.
if a.lowercased()== b.lowercased(){//Strings match
}
si.
if a.uppercased()== b.uppercased(){//Strings match
}
C.
if a.capitalized()== b.capitalized(){//Strings match
}
Convertir el caso y luego comparar es incorrecto. Vea los comentarios debajo de la pregunta.
Jim Balter
6
localizedCaseInsensitiveContains : Devuelve si el receptor contiene una cadena determinada mediante la realización de una búsqueda que no distingue entre mayúsculas y minúsculas y que reconoce la configuración regional.
if a.localizedCaseInsensitiveContains(b){//returns true if a contains b (case insensitive)
}
Editado :
caseInsensitiveCompare : Devuelve el resultado de invocar compare (_: options :) con NSCaseInsensitiveSearch como única opción.
if a.caseInsensitiveCompare(b)==.orderedSame {//returns true if a equals b (case insensitive)
}
Convertir el caso y luego comparar es incorrecto. Vea los comentarios debajo de la pregunta.
Jim Balter
1
Ejemplo de comparación de números de teléfono; usando swift 4.2
var selectPhone =[String]()if selectPhone.index(where:{$0.caseInsensitiveCompare(contactsList[indexPath.row].phone!)==.orderedSame})!=nil{
print("Same value")}else{
print("Not the same")}
Swift 4, fui por la ruta de extensión String usando caseInsensitiveCompare () como plantilla (pero permitiendo que el operando sea opcional). Aquí está el campo de juegos que solía armar (nuevo en Swift, así que los comentarios son más que bienvenidos).
importUIKitextensionString{func caseInsensitiveEquals<T>(_ otherString: T?)->Boolwhere T :StringProtocol{guardlet otherString = otherString else{returnfalse}returnself.caseInsensitiveCompare(otherString)==ComparisonResult.orderedSame
}}"string 1".caseInsensitiveEquals("string 2")// false
"thingy".caseInsensitiveEquals("thingy")// true
let nilString1:String?=nil"woohoo".caseInsensitiveEquals(nilString1)//false
No voté en contra de esto, pero tenga en cuenta que, en general, es una idea bastante mala, ya que el operador de coincidencia de patrones personalizados anterior tendrá prioridad sobre la coincidencia de patrones nativos que se usan normalmente cuando se comparan Stringinstancias entre sí (o con otros Stringliterales). Imagina let str = "isCAMELcase"que te cambian, con un caso de la siguiente manera:case "IsCamelCase": ... . Con el método anterior, esto casese ingresaría con éxito, lo que no se espera proveniente de la implementación estándar de libs de Stringcoincidencia de patrones. Sin embargo, una respuesta actualizada de Swift 3 sigue siendo buena, pero ...
dfri
... considere usar una función personalizada (o Stringextensión) como ayuda anterior en lugar de anular la Stringcoincidencia de patrones predeterminada .
Esto no funciona para algunas cadenas en algunos idiomas ... vea los comentarios debajo de la pregunta y las muchas respuestas correctas, algunas de las cuales, incluida la aceptada, precedieron a la suya por años.
Jim Balter
-2
Swift 3:
También puede utilizar la comparación localizada que no distingue entre mayúsculas y minúsculas entre la función de dos cadenas y devuelve Bool
var a ="cash"var b ="Cash"if a.localizedCaseInsensitiveContains(b){
print("Identical")}else{
print("Non Identical")}
lowercaseString
eso se menciona en algunas respuestas fallará en algunos idiomas (Straße! = STRASSE por ejemplo)caseInsensitiveCompare:
y en sulocalizedCaseInsensitiveCompare:
lugar"Straße".localizedCaseInsensitiveCompare("STRASSE")
- Recuerda importarFoundation
)Respuestas:
Prueba esto:
el resultado es el tipo de enumeración NSComparisonResult:
Entonces puede usar la declaración if:
fuente
Prueba esto :
Para vencejos mayores:
Swift 3+
fuente
a.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
caseInsensitiveCompare(_:)
no está incluido en la biblioteca estándar de Swift, sino que es parte delFoundation
marco, por lo que requiereimport Foundation
.a.lowercased() == b.lowercased()
?caseInsensitiveCompare
Método de uso :ComparisonResult le dice qué palabra viene antes que la otra en orden lexicográfico (es decir, cuál se acerca al principio de un diccionario).
.orderedSame
significa que las cadenas terminarían en el mismo lugar en el diccionariofuente
.orderedSame
significa Los documentos solo dicen que los dos operandos son iguales . Pero, ¿por qué se usa aquí la palabra "orden"? ¿Hay una secuencia o algo así? ¿Y qué hace? El operando izquierdo es más pequeño que el operando derecho. (.orderedAscending
) significa para cadenas.orderedSame
significa que las cadenas terminarían en el mismo lugar en el diccionario..orderedSame
es la abreviatura deComparisonResult.orderSame
... no es necesario que nombre el tipo ya que el compilador sabe quecaseInsensitiveCompare
devuelve unComparisonResult
. "Los dos operandos son iguales", son iguales según un orden específico ... claramente, "Efectivo" y "efectivo" no son valores de cadena idénticos. "¿Pero por qué se usa aquí la palabra 'orden'?" - porque es el resultado de una comparación ordenada. Los otros valores sonorderedAscending
yorderedDescending
... no es solo una cuestión de iguales o diferentes. En cuanto a "más pequeño": las cadenas son como números en una base grande.a.caseInsensitiveCompare(b, comparing: .orderedSame)
habría sido más legible ...fuente
MANERA CORRECTA:
Tenga en cuenta: ComparisonResult.orderedSame también se puede escribir como .orderedSame en forma abreviada.
OTRAS MANERAS:
a.
si.
C.
fuente
Podría simplemente rodar el suyo:
fuente
Editado :
fuente
También puede poner todas las letras en mayúsculas (o minúsculas) y ver si son iguales.
Esto hará que ambas variables sean
”CASH”
sean iguales.También puedes hacer una
String
extensiónfuente
Ejemplo de comparación de números de teléfono; usando swift 4.2
fuente
Swift 4, fui por la ruta de extensión String usando caseInsensitiveCompare () como plantilla (pero permitiendo que el operando sea opcional). Aquí está el campo de juegos que solía armar (nuevo en Swift, así que los comentarios son más que bienvenidos).
fuente
.orderedSame
lugar deComparisonResult.orderedSame
.Puede escribir su extensión de cadena para comparar en solo unas pocas líneas de código
fuente
Para Swift 5 Ignorando el caso y comparar dos cuerdas
fuente
Swift 3
fuente
Swift 3 : puede definir su propio operador, por ejemplo
~=
.Que luego puedes probar en un parque infantil
fuente
String
instancias entre sí (o con otrosString
literales). Imaginalet str = "isCAMELcase"
que te cambian, con un caso de la siguiente manera:case "IsCamelCase": ...
. Con el método anterior, estocase
se ingresaría con éxito, lo que no se espera proveniente de la implementación estándar de libs deString
coincidencia de patrones. Sin embargo, una respuesta actualizada de Swift 3 sigue siendo buena, pero ...String
extensión) como ayuda anterior en lugar de anular laString
coincidencia de patrones predeterminada .muestra de uso
fuente
Swift 3:
También puede utilizar la comparación localizada que no distingue entre mayúsculas y minúsculas entre la función de dos cadenas y devuelve
Bool
fuente