Durumu görmezden gelerek hızlı bir şekilde iki dizgeyi nasıl karşılaştırabiliriz? örneğin:
var a = "Cash"
var b = "cash"
Var a & var b'yi karşılaştırırsak doğru sonucunu döndürecek herhangi bir yöntem var mı
Durumu görmezden gelerek hızlı bir şekilde iki dizgeyi nasıl karşılaştırabiliriz? örneğin:
var a = "Cash"
var b = "cash"
Var a & var b'yi karşılaştırırsak doğru sonucunu döndürecek herhangi bir yöntem var mı
lowercaseStringBazı cevaplarda bahsedilenin bazı dillerde başarısız olacağını not etmek için (örneğin Straße! =
caseInsensitiveCompare:& localizedCaseInsensitiveCompare:bunun yerine
"Straße".localizedCaseInsensitiveCompare("STRASSE")- İçe Foundation
Yanıtlar:
Bunu dene:
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)
sonuç NSComparisonResult numaralandırmasının türüdür:
enum NSComparisonResult : Int {
case OrderedAscending
case OrderedSame
case OrderedDescending
}
Yani if ifadesini kullanabilirsiniz:
if result == .OrderedSame {
println("equal")
} else {
println("not equal")
}
Bunu dene :
Daha yaşlı hızlılar için:
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(_:)Swift Standart Kitaplığı'na dahil edilmemiştir, bunun yerine Foundationçerçevenin bir parçasıdır , dolayısıyla gerektirir import Foundation.
a.lowercased() == b.lowercased()?
Kullanım caseInsensitiveCompareyöntemi:
let a = "Cash"
let b = "cash"
let c = a.caseInsensitiveCompare(b) == .orderedSame
print(c) // "true"
ComparisonResult , sözlük sırasına göre hangi kelimenin diğerinden daha önce geldiğini söyler (yani hangisinin bir sözlüğün önüne daha yakın olduğunu). .orderedSamedizelerin sözlükte aynı noktada yer alacağı anlamına gelir
.orderedSamegeliyor? Dokümanlar sadece söylemek iki işlenen eşittir . Ama burada neden 'düzen' kelimesi kullanılıyor? Bir sekans falan var mı? Ve ne yapar Sol işlenen, sağ işlenenden daha küçüktür. ( .orderedAscending) dizeler için ortalama
.orderedSamedizelerin sözlükte aynı noktada yer alacağı anlamına gelir.
.orderedSamekısaltmasıdır ComparisonResult.orderSame... derleyici bunun caseInsensitiveComparebir ComparisonResult. "İki işlenen eşittir" - belirli bir sıralamaya göre eşittirler ... açıkça, "Nakit" ve "nakit" aynı dize değerleri değildir. "Ama neden burada 'düzen' kelimesi kullanılıyor?" - çünkü sıralı bir karşılaştırmanın sonucudur. Diğer değerler orderedAscendingve orderedDescending... bu sadece aynı veya farklı bir soru değil. "Daha küçük" e gelince: dizeler büyük bir tabandaki sayılar gibidir.
a.caseInsensitiveCompare(b, comparing: .orderedSame)daha okunaklı olabilirdi ...
if a.lowercaseString == b.lowercaseString {
//Strings match
}
DOĞRU YOL:
let a: String = "Cash"
let b: String = "cash"
if a.caseInsensitiveCompare(b) == .orderedSame {
//Strings match
}
Lütfen dikkat: ComparisonResult.orderedSame, kısaca .orderedSame olarak da yazılabilir.
DİĞER YOLLAR:
a.
if a.lowercased() == b.lowercased() {
//Strings match
}
b.
if a.uppercased() == b.uppercased() {
//Strings match
}
c.
if a.capitalized() == b.capitalized() {
//Strings match
}
localizedCaseInsensitiveContains : Büyük / küçük harfe duyarlı olmayan, yerel ayara duyarlı bir arama gerçekleştirerek alıcının belirli bir dizeyi içerip içermediğini döndürür
if a.localizedCaseInsensitiveContains(b) {
//returns true if a contains b (case insensitive)
}
Düzenlendi :
caseInsensitiveCompare : Tek seçenek olarak NSCaseInsensitiveSearch ile karşılaştırma (_: options :) çağrısının sonucunu döndürür.
if a.caseInsensitiveCompare(b) == .orderedSame {
//returns true if a equals b (case insensitive)
}
Kendinizinkini atabilir misiniz?
func equalIgnoringCase(a:String, b:String) -> Bool {
return a.lowercaseString == b.lowercaseString
}
Ayrıca tüm harfleri büyük (veya küçük) yapabilir ve aynı olup olmadıklarını görebilirsiniz.
var a = “Cash”
var b = “CASh”
if a.uppercaseString == b.uppercaseString{
//DO SOMETHING
}
Bu, her iki değişkeni ”CASH”de eşit yapar ve dolayısıyla eşit olur.
Ayrıca bir Stringuzantı da yapabilirsiniz
extension String{
func equalsIgnoreCase(string:String) -> Bool{
return self.uppercaseString == string.uppercaseString
}
}
if "Something ELSE".equalsIgnoreCase("something Else"){
print("TRUE")
}
Swift 4, şablon olarak caseInsensitiveCompare () kullanarak String uzantısı yoluna gittim (ancak işlenenin isteğe bağlı olmasına izin verdi). İşte onu bir araya getirdiğim oyun alanı (Swift için yeni, bu yüzden hoş geldiniz fazlasıyla geri bildirimde bulunun).
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
.orderedSameyerine kullanabilirsiniz ComparisonResult.orderedSame.
Sadece birkaç satır kodla karşılaştırma yapmak için Dize Uzantınızı yazabilirsiniz.
extension String {
func compare(_ with : String)->Bool{
return self.caseInsensitiveCompare(with) == .orderedSame
}
}
Swift 3 : Kendi operatörünüzü tanımlayabilirsiniz, örn ~=.
infix operator ~=
func ~=(lhs: String, rhs: String) -> Bool {
return lhs.caseInsensitiveCompare(rhs) == .orderedSame
}
Daha sonra bir oyun alanında deneyebilirsiniz
let low = "hej"
let up = "Hej"
func test() {
if low ~= up {
print("same")
} else {
print("not same")
}
}
test() // prints 'same'
Stringörnekleri birbirleriyle (veya diğer Stringdeğişmezlerle) eşleştirirken genellikle kullanılan yerel desen eşleştirmesine göre öncelikli olacaktır . Imagine let str = "isCAMELcase"aşağıdaki gibi bir dava ile, üzerinde geçiriliyor: case "IsCamelCase": ... . Yukarıdaki yöntemle, bu casebaşarılı bir şekilde girilebilir ve bu, Stringkalıp eşleştirmesinin standart kitaplık uygulamasından gelmesi beklenmez . Güncellenmiş bir Swift 3 cevabı yine de iyi, ancak ...
Stringvarsayılan Stringdesen eşleşmesini geçersiz kılmak yerine yukarıda yardımcı olarak özel bir işlev (veya uzantı) kullanmayı düşünün .
Hızlı 3
if a.lowercased() == b.lowercased() {
}
extension String
{
func equalIgnoreCase(_ compare:String) -> Bool
{
return self.uppercased() == compare.uppercased()
}
}
kullanım örneği
print("lala".equalIgnoreCase("LALA"))
print("l4la".equalIgnoreCase("LALA"))
print("laLa".equalIgnoreCase("LALA"))
print("LALa".equalIgnoreCase("LALA"))
Swift 3:
İki dize işlevi arasında yerelleştirilmiş büyük / küçük harfe duyarlı olmayan karşılaştırmayı da kullanabilirsiniz ve Bool
var a = "cash"
var b = "Cash"
if a.localizedCaseInsensitiveContains(b) {
print("Identical")
} else {
print("Non Identical")
}