Jak możemy porównać dwa ciągi w szybkim ignorowaniu przypadku? na przykład:
var a = "Cash"
var b = "cash"
Czy istnieje metoda, która zwróci wartość true, jeśli porównamy var a & var b
Jak możemy porównać dwa ciągi w szybkim ignorowaniu przypadku? na przykład:
var a = "Cash"
var b = "cash"
Czy istnieje metoda, która zwróci wartość true, jeśli porównamy var a & var b
lowercaseStringże jest to wymienione w niektórych odpowiedziach w niektórych językach (na przykład Straße! = STRASSE)
caseInsensitiveCompare:& localizedCaseInsensitiveCompare:zamiast tego
"Straße".localizedCaseInsensitiveCompare("STRASSE")- Pamiętaj, aby zaimportować Foundation)
Odpowiedzi:
Spróbuj tego:
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)
wynik jest typem wyliczenia NSComparisonResult:
enum NSComparisonResult : Int {
case OrderedAscending
case OrderedSame
case OrderedDescending
}
Możesz więc użyć instrukcji if:
if result == .OrderedSame {
println("equal")
} else {
println("not equal")
}
Spróbuj tego :
Dla starszych jerzyków:
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(_:)nie jest uwzględniony w Swift Standard Library, jest raczej częścią Foundationstruktury, a zatem wymaga import Foundation.
a.lowercased() == b.lowercased()?
Użyj caseInsensitiveComparemetody:
let a = "Cash"
let b = "cash"
let c = a.caseInsensitiveCompare(b) == .orderedSame
print(c) // "true"
CompareResult informuje, które słowo występuje wcześniej niż inne w kolejności leksykograficznej (tj. Które z nich jest bliżej początku słownika). .orderedSameoznacza, że łańcuchy znajdą się w tym samym miejscu w słowniku
.orderedSameoznacza, że łańcuchy trafiłyby do tego samego miejsca w słowniku.
.orderedSameto skrót od ComparisonResult.orderSame... nie musisz nazywać typu, ponieważ kompilator wie, że caseInsensitiveComparezwraca plik ComparisonResult. „Te dwa operandy są równe” - są równe zgodnie z określoną kolejnością… oczywiście „gotówka” i „gotówka” nie są identycznymi ciągami znaków. - Ale dlaczego użyto tutaj słowa „kolejność”? - bo to wynik uporządkowanego porównania. Pozostałe wartości to orderedAscendingi orderedDescending... to nie jest tylko kwestia tego samego lub innego. Jeśli chodzi o „mniejsze”: łańcuchy są jak liczby w dużej bazie.
a.caseInsensitiveCompare(b, comparing: .orderedSame)byłby bardziej czytelny ...
if a.lowercaseString == b.lowercaseString {
//Strings match
}
WŁAŚCIWA DROGA:
let a: String = "Cash"
let b: String = "cash"
if a.caseInsensitiveCompare(b) == .orderedSame {
//Strings match
}
Uwaga: CompareResult.orderedSame można również zapisać jako .orderedSame w skrócie.
INACZEJ:
za.
if a.lowercased() == b.lowercased() {
//Strings match
}
b.
if a.uppercased() == b.uppercased() {
//Strings match
}
do.
if a.capitalized() == b.capitalized() {
//Strings match
}
Możesz po prostu rzucić własne:
func equalIgnoringCase(a:String, b:String) -> Bool {
return a.lowercaseString == b.lowercaseString
}
localizedCaseInsensitiveContains : zwraca, czy odbiornik zawiera dany ciąg, wykonując wyszukiwanie bez uwzględniania wielkości liter i uwzględniające ustawienia regionalne
if a.localizedCaseInsensitiveContains(b) {
//returns true if a contains b (case insensitive)
}
Edytowano :
caseInsensitiveCompare : Zwraca wynik wywołania porównania (_: options :) z NSCaseInsensitiveSearch jako jedyną opcją.
if a.caseInsensitiveCompare(b) == .orderedSame {
//returns true if a equals b (case insensitive)
}
Możesz także uczynić wszystkie litery dużymi (lub małymi) i sprawdzić, czy są takie same.
var a = “Cash”
var b = “CASh”
if a.uppercaseString == b.uppercaseString{
//DO SOMETHING
}
Spowoduje to, że obie zmienne ”CASH”będą takie same, a zatem będą równe.
Możesz także zrobić Stringrozszerzenie
extension String{
func equalsIgnoreCase(string:String) -> Bool{
return self.uppercaseString == string.uppercaseString
}
}
if "Something ELSE".equalsIgnoreCase("something Else"){
print("TRUE")
}
Swift 4, poszedłem na ścieżkę rozszerzenia String, używając caseInsensitiveCompare () jako szablonu (ale pozwalając, aby operand był opcjonalny). Oto plac zabaw, na którym go składałem (nowość w Swift, więc opinie są mile widziane).
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
.orderedSamezamiast ComparisonResult.orderedSame.
Możesz po prostu napisać rozszerzenie ciągu do porównania w zaledwie kilku wierszach kodu
extension String {
func compare(_ with : String)->Bool{
return self.caseInsensitiveCompare(with) == .orderedSame
}
}
Szybki 3
if a.lowercased() == b.lowercased() {
}
Swift 3 : Możesz zdefiniować własnego operatora, np ~=.
infix operator ~=
func ~=(lhs: String, rhs: String) -> Bool {
return lhs.caseInsensitiveCompare(rhs) == .orderedSame
}
Które możesz następnie wypróbować na placu zabaw
let low = "hej"
let up = "Hej"
func test() {
if low ~= up {
print("same")
} else {
print("not same")
}
}
test() // prints 'same'
Stringwystąpień do siebie (lub do innych Stringliterałów). Wyobraźmy sobie, let str = "isCAMELcase"są przełączane, w przypadku następująco: case "IsCamelCase": ... . W przypadku powyższej metody casezostanie to wprowadzone pomyślnie, czego nie oczekuje się w przypadku standardowej implementacji Stringdopasowania wzorców w bibliotekach . Zaktualizowana odpowiedź Swift 3 jest jednak nadal dobra, ale ...
Stringrozszerzenia) jako pomocnika powyżej zamiast nadpisywania domyślnego Stringdopasowania wzorców.
extension String
{
func equalIgnoreCase(_ compare:String) -> Bool
{
return self.uppercased() == compare.uppercased()
}
}
próbka użycia
print("lala".equalIgnoreCase("LALA"))
print("l4la".equalIgnoreCase("LALA"))
print("laLa".equalIgnoreCase("LALA"))
print("LALa".equalIgnoreCase("LALA"))
Swift 3:
Możesz również użyć zlokalizowanego porównania bez rozróżniania wielkości liter między dwoma funkcjami ciągów i zwraca Bool
var a = "cash"
var b = "Cash"
if a.localizedCaseInsensitiveContains(b) {
print("Identical")
} else {
print("Non Identical")
}