Comment pouvons-nous comparer deux chaînes en cas d'ignorance rapide? par exemple:
var a = "Cash"
var b = "cash"
Y a-t-il une méthode qui retournera true si nous comparons var a et var b
Comment pouvons-nous comparer deux chaînes en cas d'ignorance rapide? par exemple:
var a = "Cash"
var b = "cash"
Y a-t-il une méthode qui retournera true si nous comparons var a et var b
lowercaseString
cela est mentionné dans certaines réponses échouera dans certaines langues (Straße! = STRASSE par exemple)
caseInsensitiveCompare:
et à la localizedCaseInsensitiveCompare:
place
"Straße".localizedCaseInsensitiveCompare("STRASSE")
- N'oubliez pas d'importer Foundation
)
Réponses:
Essaye ça:
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)
result est le type de NSComparisonResult enum:
enum NSComparisonResult : Int {
case OrderedAscending
case OrderedSame
case OrderedDescending
}
Vous pouvez donc utiliser l'instruction if:
if result == .OrderedSame {
println("equal")
} else {
println("not equal")
}
Essaye ça :
Pour les swift plus âgés:
var a : String = "Cash"
var b : String = "cash"
if(a.caseInsensitiveCompare(b) == NSComparisonResult.OrderedSame){
println("voila")
}
Swift 3+
var a : String = "Cash"
var b : String = "cash"
if(a.caseInsensitiveCompare(b) == .orderedSame){
print("voila")
}
a.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
caseInsensitiveCompare(_:)
n'est pas inclus dans la bibliothèque standard Swift, mais fait plutôt partie du Foundation
framework, donc, nécessitant import Foundation
.
a.lowercased() == b.lowercased()
?
Utilisez la caseInsensitiveCompare
méthode:
let a = "Cash"
let b = "cash"
let c = a.caseInsensitiveCompare(b) == .orderedSame
print(c) // "true"
ComparisonResult vous indique quel mot vient plus tôt que l'autre dans l'ordre lexicographique (c'est-à-dire lequel se rapproche le plus du début d'un dictionnaire). .orderedSame
signifie que les chaînes finiraient au même endroit dans le dictionnaire
.orderedSame
dire? La documentation dit simplement que les deux opérandes sont égaux . Mais pourquoi le mot «ordre» est-il utilisé ici? Y a-t-il une séquence ou quelque chose? Et que fait L'opérande gauche est plus petit que l'opérande droit. ( .orderedAscending
) signifie pour les chaînes
.orderedSame
signifie que les chaînes se retrouveraient au même endroit dans le dictionnaire.
.orderedSame
est l'abréviation de ComparisonResult.orderSame
... vous n'avez pas besoin de nommer le type puisque le compilateur sait que caseInsensitiveCompare
renvoie un ComparisonResult
. "Les deux opérandes sont égaux" - ils sont égaux selon un ordre spécifique ... clairement, "Cash" et "Cash" ne sont pas des valeurs de chaîne identiques. "Mais pourquoi le mot" ordre "est-il utilisé ici?" - parce que c'est le résultat d'une comparaison ordonnée. Les autres valeurs sont orderedAscending
et orderedDescending
... ce n'est pas seulement une question de même ou de différent. Quant à "plus petit": les chaînes sont comme des nombres dans une grande base.
a.caseInsensitiveCompare(b, comparing: .orderedSame)
aurait été plus lisible ...
if a.lowercaseString == b.lowercaseString {
//Strings match
}
BONNE MANIÈRE:
let a: String = "Cash"
let b: String = "cash"
if a.caseInsensitiveCompare(b) == .orderedSame {
//Strings match
}
Notez s'il vous plaît: ComparisonResult.orderedSame peut également être écrit sous la forme .orderedSame en raccourci.
D'AUTRES MOYENS:
une.
if a.lowercased() == b.lowercased() {
//Strings match
}
b.
if a.uppercased() == b.uppercased() {
//Strings match
}
c.
if a.capitalized() == b.capitalized() {
//Strings match
}
Pourrait juste rouler le vôtre:
func equalIgnoringCase(a:String, b:String) -> Bool {
return a.lowercaseString == b.lowercaseString
}
localizedCaseInsensitiveContains : renvoie si le récepteur contient une chaîne donnée en effectuant une recherche insensible à la casse et tenant compte des paramètres régionaux
if a.localizedCaseInsensitiveContains(b) {
//returns true if a contains b (case insensitive)
}
Modifié :
caseInsensitiveCompare : renvoie le résultat de l'appel de compare (_: options :) avec NSCaseInsensitiveSearch comme seule option.
if a.caseInsensitiveCompare(b) == .orderedSame {
//returns true if a equals b (case insensitive)
}
Vous pouvez également mettre toutes les lettres en majuscules (ou en minuscules) et voir si elles sont identiques.
var a = “Cash”
var b = “CASh”
if a.uppercaseString == b.uppercaseString{
//DO SOMETHING
}
Cela rendra les deux variables comme ”CASH”
et donc elles sont égales.
Vous pouvez également créer une String
extension
extension String{
func equalsIgnoreCase(string:String) -> Bool{
return self.uppercaseString == string.uppercaseString
}
}
if "Something ELSE".equalsIgnoreCase("something Else"){
print("TRUE")
}
Swift 4, j'ai choisi la route d'extension String en utilisant caseInsensitiveCompare () comme modèle (mais en permettant à l'opérande d'être facultatif). Voici le terrain de jeu que j'ai utilisé pour le mettre en place (nouveau sur Swift, donc les commentaires sont les bienvenus).
import UIKit
extension String {
func caseInsensitiveEquals<T>(_ otherString: T?) -> Bool where T : StringProtocol {
guard let otherString = otherString else {
return false
}
return self.caseInsensitiveCompare(otherString) == ComparisonResult.orderedSame
}
}
"string 1".caseInsensitiveEquals("string 2") // false
"thingy".caseInsensitiveEquals("thingy") // true
let nilString1: String? = nil
"woohoo".caseInsensitiveEquals(nilString1) // false
.orderedSame
plutôt que ComparisonResult.orderedSame
.
Vous pouvez simplement écrire votre extension de chaîne à des fins de comparaison en quelques lignes de code
extension String {
func compare(_ with : String)->Bool{
return self.caseInsensitiveCompare(with) == .orderedSame
}
}
Swift 3
if a.lowercased() == b.lowercased() {
}
Swift 3 : Vous pouvez définir votre propre opérateur, par exemple ~=
.
infix operator ~=
func ~=(lhs: String, rhs: String) -> Bool {
return lhs.caseInsensitiveCompare(rhs) == .orderedSame
}
Que vous pouvez ensuite essayer dans une aire de jeux
let low = "hej"
let up = "Hej"
func test() {
if low ~= up {
print("same")
} else {
print("not same")
}
}
test() // prints 'same'
String
instances entre elles (ou avec d'autres String
littéraux). Imaginez let str = "isCAMELcase"
être basculé, avec un cas comme suit: case "IsCamelCase": ...
. Avec la méthode ci-dessus, cela case
serait entré avec succès, ce qui ne devrait pas provenir de l'implémentation standard des bibliothèques de String
correspondance de modèles. Une réponse Swift 3 mise à jour est toujours bonne, mais ...
String
extension) comme aide ci-dessus plutôt que de remplacer la String
correspondance de modèle par défaut .
extension String
{
func equalIgnoreCase(_ compare:String) -> Bool
{
return self.uppercased() == compare.uppercased()
}
}
échantillon d'utilisation
print("lala".equalIgnoreCase("LALA"))
print("l4la".equalIgnoreCase("LALA"))
print("laLa".equalIgnoreCase("LALA"))
print("LALa".equalIgnoreCase("LALA"))
Swift 3:
Vous pouvez également utiliser la fonction de comparaison localisée insensible à la casse entre deux chaînes et elle renvoie Bool
var a = "cash"
var b = "Cash"
if a.localizedCaseInsensitiveContains(b) {
print("Identical")
} else {
print("Non Identical")
}