2015-05-29 7 views
54

Wie können wir zwei Strings im Fall des schnellen Ignorierens vergleichen? für zB:Wie zwei Strings zu vergleichen, den Fall in Swift-Sprache ignorierend?

var a = "Cash" 
var b = "cash" 

Gibt es eine Methode, die wahr zurück, wenn wir var ein & var b

+1

Sie beide vor dem Vergleich tun in Kleinbuchstaben umwandeln könnte . –

+4

Nur um zu bemerken, dass 'lowcaseString', das in einigen Antworten erwähnt wird, in einigen Sprachen fehlschlägt (Straße! = STRASSE zum Beispiel) – Alladinian

+0

@Alladianisch, wie würden Sie vorschlagen, es dann zu tun. Die meisten Beispiele zur Behebung dieses Problems zeigen die Konvertierung in Groß- oder Kleinbuchstaben. – Steve

Antwort

108

Versuchen Sie folgendes::

Sie könnten auch einen String Erweiterung

extension String{ 
    func equalsIgnoreCase(string:String) -> Bool{ 
    return self.uppercaseString == string.uppercaseString 
    } 
} 

if "Something ELSE".equalsIgnoreCase("something Else"){ 
    print("TRUE") 
} 
+10

In Swift 3 müssen Sie 'a.caseInsensitiveCompare (b) == ComparisonResult.orderedSame' verwenden – azhidkov

+0

Hinweis:' caseInsensitiveCompare (_ :) 'ist nicht in der Swift Standard Library enthalten, sondern ist Teil des 'Foundation'-Frameworks daher "import foundation" erforderlich. – chrisamanse

+2

Ich kann nicht der einzige sein, der den voila-Ausdruck liebt. – the4kman

9

Try this vergleichen:

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) 

Ergebnis ist Art von NSComparisonResult Enum:

enum NSComparisonResult : Int { 

    case OrderedAscending 
    case OrderedSame 
    case OrderedDescending 
} 

So können Sie verwenden, wenn Anweisung:

if result == .OrderedSame { 
    println("equal") 
} else { 
    println("not equal") 
} 
+0

Wenn ich mich richtig erinnere, sind die Bereichs- und Gebietsschema-Parameter optional und können vollständig weggelassen werden. –

+3

Ja, ich wollte die ganze Methode mit allen Parametern zeigen. – Greg

+0

Sie sollten hier die richtige Antwort haben. Beim Vergleich von Strings geht es nicht nur darum zu wissen, ob sie gleich sind oder nicht – Mikael

5

konnte nur Ihre eigene Rolle:

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

Konvertieren von Groß-/Kleinschreibung und dann Vergleich ist falsch. Siehe die Kommentare unter der Frage. –

19
if a.lowercaseString == b.lowercaseString { 
    //Strings match 
} 
+1

Pure Swift ist der Weg dorthin. Keine Notwendigkeit für die Gründung. – Alexander

+1

Konvertierung von Groß- und Kleinschreibung ist falsch. Siehe die Kommentare unter der Frage. –

+0

@JimBalter Ich würde nicht sagen, dass es "falsch" ist, da es das Beispiel in der Frage des OP beantwortet. Für diejenigen von uns, die keine Lokalisierung unterstützen müssen, ist dies viel sauberer! – toddg

0

Sie auch alle Buchstaben groß geschrieben werden könnten (oder klein) und sehen, ob sie gleich sind.

var a = “Cash” 
var b = “CASh” 

if a.uppercaseString == b.uppercaseString{ 
    //DO SOMETHING 
} 

Dies wird beide Variablen als ”CASH” machen und sie sind somit gleich.

let a = "Cash" 
let b = "cash" 
let c = a.caseInsensitiveCompare(b) == .orderedSame 
println(c) // prints "true" 
+0

Fall umwandeln und dann ist der Vergleich falsch. Siehe die Kommentare unter der Frage. –

20

Verwenden caseInsensitiveCompare Methode machen

Für ältere swift:

var a : String = "Cash" 
var b : String = "cash" 

if(a.caseInsensitiveCompare(b) == NSComparisonResult.OrderedSame){ 
    println("voila") 
} 

Swift 3,0

if(a.caseInsensitiveCompare(b) == ComparisonResult.orderedSame){ 
     print("voila") 
} 
-1

Swift 3

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

} 
+0

Das ist falsch. Siehe die Kommentare unter der Frage. –

-1

Swift 3: Sie können Ihre eigenen Operator definieren, z.B. ~=.

infix operator ~= 

func ~=(lhs: String, rhs: String) -> Bool { 
    return lhs.caseInsensitiveCompare(rhs) == .orderedSame 
} 

, die Sie dann auf einem Spielplatz versuchen

let low = "hej" 
let up = "Hej" 

func test() { 
    if low ~= up { 
     print("same") 
    } else { 
     print("not same") 
    } 
} 

test() // prints 'same' 
+0

Ich habe dies nicht abgemeldet, aber beachte, dass dies im Allgemeinen eine ziemlich schlechte Idee ist, da der oben genannte benutzerdefinierte Musterübereinstimmungs - Operator Vorrang vor dem nativen Mustervergleich hat, der normalerweise verwendet wird, wenn 'String' - Instanzen zueinander passen 'Literale). Stellen Sie sich vor, dass "let str =" isCAMELcase "' umgeschaltet wird, mit einem Fall wie folgt: 'case" IsCamelCase ": ...'. Mit der obigen Methode würde dieser "Fall" erfolgreich eingegeben werden, was nicht von der Standard-libs-Implementierung des 'String'-Mustervergleichs erwartet wird. Eine aktualisierte Swift 3-Antwort ist zwar immer noch gut, aber ... – dfri

+0

... überlegen Sie, eine benutzerdefinierte Funktion (oder 'String'-Erweiterung) als Hilfsprogramm zu verwenden, anstatt das standardmäßige' String'-Muster-Matching zu überschreiben. – dfri

-1

Swift 3:

Sie können auch den lokalen Groß- und Kleinschreibung Vergleich zwischen zwei Zeichenketten-Funktion verwenden und es gibt Bool

var a = "cash" 
var b = "Cash" 

if a.localizedCaseInsensitiveContains(b) { 
    print("Identical")   
} else { 
    print("Non Identical") 
} 
4

Swift 3

richtige Weg:

let a: String = "Cash" 
    let b: String = "cash" 

    if a.caseInsensitiveCompare(b) == .orderedSame { 
     //Strings match 
    } 

Bitte beachten Sie: ComparisonResult.orderedSame kann auch als .orderedSame in Kurzschrift geschrieben werden.

ANDERE WEGE:

ein.

if a.lowercased() == b.lowercased() { 
     //Strings match 
    } 

b.

if a.uppercased() == b.uppercased() { 
     //Strings match 
    } 

c.

if a.capitalized() == b.capitalized() { 
     //Strings match 
    } 
0
extension String 
{ 
    func equalIgnoreCase(_ compare:String) -> Bool 
    { 
     return self.uppercased() == compare.uppercased() 
    } 
} 

Probe Nutzungs

print("lala".equalIgnoreCase("LALA")) 
    print("l4la".equalIgnoreCase("LALA")) 
    print("laLa".equalIgnoreCase("LALA")) 
    print("LALa".equalIgnoreCase("LALA")) 
0

Swift 4, ging ich die String Erstreckungsroute caseInsensitiveCompare() als Matrize verwendet (aber so dass die Operanden eine optional zu sein). Hier ist der Spielplatz, den ich verwendet habe, um es zusammen zu bringen (neu zu Swift, so Feedback mehr als willkommen).

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 
0

localizedCaseInsensitiveContains: Gibt an, ob der Empfänger enthält eine bestimmte Zeichenkette durch einen Groß- und Kleinschreibung, locale-aware Suche durchführen

if a.localizedCaseInsensitiveContains(b) { 
//returns true if a contains b (case insensitive) 
} 
Verwandte Themen