Swift dilinde durumu yok sayarak iki dizeyi nasıl karşılaştırabilirim?


98

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ı


1
Karşılaştırma yapmadan önce her ikisini de küçük harfe dönüştürebilirsiniz.
Dino Tw

10
lowercaseStringBazı cevaplarda bahsedilenin bazı dillerde başarısız olacağını not etmek için (örneğin Straße! =
STRASSE

@Alladinian o zaman nasıl yapılmasını önerirsin. Bu sorunu çözmek için çoğu örnek, tamamen büyük harfe mi yoksa tümü küçük harfe mi dönüştürüldüğünü gösteriyor?
Steve

5
@Steve Apple öneriyor caseInsensitiveCompare:& localizedCaseInsensitiveCompare:bunun yerine
Alladinian,

3
@Steve Tabii! (deneyebilirsiniz "Straße".localizedCaseInsensitiveCompare("STRASSE")- İçe Foundation
aktarmayı

Yanıtlar:


15

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

Doğru hatırlarsam, aralık ve yerel ayar parametreleri isteğe bağlıdır ve tamamen ihmal edilebilir.
Mick MacCallum

3
Evet, gerçekten, bütün metodu tüm parametrelerle göstermek istedim.
Greg

Burada doğru cevaba sahip olmalısınız. Dizeleri karşılaştırmak sadece eşit olup olmadıklarını bilmekle ilgili değildir
Mikael

186

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

13
Swift 3'te kullanmanız gerekira.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
azhidkov

3
Not: caseInsensitiveCompare(_:)Swift Standart Kitaplığı'na dahil edilmemiştir, bunun yerine Foundationçerçevenin bir parçasıdır , dolayısıyla gerektirir import Foundation.
chrisamanse

Bunun daha iyi olmasının herhangi bir nedeni var mı a.lowercased() == b.lowercased()?
jowie

Diğer yorumlarda belirtildiği gibi @jowie, alt / üst harf () kullanmak bazı dillerde başarısız olabilir.
cumanzor

37

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


ne anlama .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
Honey

1
@Honey Comparison sonucu, sözlük sırasına göre hangi kelimenin diğerinden daha önce geldiğini (yani hangisinin bir sözlüğün önüne daha yakın olduğunu) söyler. .orderedSamedizelerin sözlükte aynı noktada yer alacağı anlamına gelir.
Sergey Kalinichenko

1
@Honey .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.
Jim Balter

1
Bunun korkunç bir API tasarımı olduğunu düşünüyorum. İmzayı okumak kolay değil ... Bunu yapmak a.caseInsensitiveCompare(b, comparing: .orderedSame)daha okunaklı olabilirdi ...
Honey

24
if a.lowercaseString == b.lowercaseString {
    //Strings match
}

2
Pure Swift, buraya gitmenin yoludur. Vakfa gerek yok.
Alexander

3
Vakayı dönüştürmek ve sonra karşılaştırmak yanlış. Sorunun altındaki yorumlara bakın.
Jim Balter

1
@JimBalter OP'nin sorusunda verilen örneği yanıtladığı için "yanlış" olduğunu söyleyemem. Yerelleştirmeyi desteklemesi gerekmeyenler için bu çok daha temiz!
Toddg

5
^ Hayır, yanlış. Bir örnek için bir şeyin işe yaraması konu dışıdır. Bu hack hiç "daha temiz" değil. Kabul edilen cevap doğru ve temiz çözümü verir.
Jim Balter

8

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 
}

7

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

2
Soru sınırlama değil karşılaştırma ile ilgili.
Jim Balter

Eğer "Bir b içeriyor" ve "B içeren bir" onlar eşittir. Bu yüzden, en etkili çözüm olmasa bile, bu kesinlikle olası bir çözümdür.
Philipp Maurer

6

Kendinizinkini atabilir misiniz?

func equalIgnoringCase(a:String, b:String) -> Bool {
    return a.lowercaseString == b.lowercaseString
}

4
Vakayı dönüştürmek ve sonra karşılaştırmak yanlış. Sorunun altındaki yorumlara bakın.
Jim Balter

1

Telefon numaraları karşılaştırma örneği; Swift 4.2 kullanarak

var selectPhone = [String]()

if selectPhone.index(where: {$0.caseInsensitiveCompare(contactsList[indexPath.row].phone!) == .orderedSame}) != nil {
    print("Same value")
} else {
    print("Not the same")
}

0

Ayrıca tüm harfleri büyük (veya küçük) yapabilir ve aynı olup olmadıklarını görebilirsiniz.

var a = “Cashvar b = “CAShif 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")
}

4
Vakayı dönüştürmek ve sonra karşılaştırmak yanlış. Sorunun altındaki yorumlara bakın.
Jim Balter

0

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

2
Bunun .orderedSameyerine kullanabilirsiniz ComparisonResult.orderedSame.
Jim Balter

0

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

0

Swift 5 için durumu görmezden gelin ve iki dizeyi karşılaştırın

var a = "cash"
var b = "Cash"
if(a.caseInsensitiveCompare(b) == .orderedSame){
     print("Ok")
}

-1

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'

1
Bunu olumsuz oylamadım, ancak bunun genellikle oldukça kötü bir fikir olduğunu unutmayın, çünkü yukarıdaki özel desen eşleştirme operatörü, 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 ...
dfrib

... 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 .
dfrib

-2

Hızlı 3

if a.lowercased() == b.lowercased() {

}

3
Bu yanlış. Sorunun altındaki yorumlara bakın.
Jim Balter

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

2
Bu, bazı dillerde bazı dizeler için çalışmaz ... Sorunun altındaki yorumlara ve bazıları - kabul edilenler de dahil olmak üzere - yıllarca sizinkinden önce gelen birçok doğru cevaba bakın.
Jim Balter

-3

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

3
Çözümünüz yanlış. "
Casha
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.