Co to jest Swift odpowiednik isEqualToString w Objective-C?


271

Próbuję uruchomić poniższy kod:

import UIKit

class LoginViewController: UIViewController {

@IBOutlet var username : UITextField = UITextField()
@IBOutlet var password : UITextField = UITextField()

@IBAction func loginButton(sender : AnyObject) {

    if username .isEqual("") || password.isEqual(""))
    {
        println("Sign in failed. Empty character")
    }
}

Mój poprzedni kod był w Objective-C, który działał dobrze:

 if([[self.username text] isEqualToString: @""] ||
    [[self.password text] isEqualToString: @""] ) {

Zakładam, że nie mogę używać isEqualToStringw Swift. Każda pomoc będzie mile widziana.

Odpowiedzi:


427

Dzięki Swift nie musisz już sprawdzać równości isEqualToString

Możesz teraz użyć ==

Przykład:

let x = "hello"
let y = "hello"
let isEqual = (x == y)

teraz isEqual jest true.


37
===jest operatorami tożsamości, podczas gdy ==jest operatorem równości (domyślnie wywołuje isEqual:NSObject i jego podklasy)
Bryan Chen

3
Tak, przepraszam, „równość”, nie tożsamość. Niewłaściwe słowo :)
JJSaccolo

1
Ale chyba mi czegoś brakuje, to nie wydaje się, można sprawdzić tożsamość między ciągi: 'String' does not conform to protocol 'AnyObject'.

3
@ user1040049 Nie można porównywać napisów za pomocą operatora ===, ponieważ napis w swift jest typu struct, a nie klasa. Jeśli wpiszesz rzut / tekst jako NSString, możesz porównać za pomocą operatora ===.
sanjana

3
@JJSaccolo naprawdę wprowadzasz w błąd w kwestii tożsamości. To pytanie o Stringporównanie. Xcode 6.4 zwraca błądBinary operator '===' cannot be applied to two String operands
Dima Depłow

47

Użyj operatora == zamiastisEqual

Porównywanie ciągów

Swift oferuje trzy sposoby porównywania wartości ciągów: równość ciągów, równość prefiksów i równość sufiksów.

Równość ciągów

Dwie wartości ciągu są uważane za równe, jeśli zawierają dokładnie te same znaki w tej samej kolejności:

let quotation = "We're a lot alike, you and I."
let sameQuotation = "We're a lot alike, you and I."
if quotation == sameQuotation {
    println("These two strings are considered equal")
}
// prints "These two strings are considered equal"
.
.
.

Więcej informacji można znaleźć w oficjalnej dokumentacji Swift (wyszukiwanie ciągów porównawczych) .


13

Oprócz @JJSaccoloodpowiedzi, możesz utworzyć niestandardową equalsmetodę jako nowe rozszerzenie String, takie jak:

extension String {
     func isEqualToString(find: String) -> Bool {
        return String(format: self) == find
    }
}

I użycie:

let a = "abc"
let b = "abc"

if a.isEqualToString(b) {
     println("Equals")
}

Na pewno oryginalny operator ==może być lepszy (działa jak w Javascript), ale dla mnie isEqualmetoda daje pewną czytelność kodu, że porównujemy ciągi

Mam nadzieję, że to komuś pomoże


8

W Swift operator == jest równoważny metodzie isEqual: celu C (wywołuje metodę isEqual zamiast tylko porównywania wskaźników, a nowa metoda === do testowania, czy wskaźniki są takie same), więc możesz po prostu napisać to jako:

if username == "" || password == ""
{
    println("Sign in failed. Empty character")
}

podczas gdy działa to szybko - spowoduje spustoszenie w objc, jeśli / kiedy nazwa użytkownika jest równa zero. Jak zasugerowano powyżej - użyj username.isEmpty, a gdzieś istnieje równoważne makro IsEmpty dla celu c.
johndpope

W Swift, chyba że nazwa użytkownika jest zadeklarowana jako String? (alias Opcjonalnie <String>), to nie może być zero. W Celu C możesz po prostu powiedzieć, czy ([długość nazwy użytkownika] == 0 || [długość hasła] == 0) {...}, aby pokryć zero lub puste przypadki.
Nick Lockwood

6

W rzeczywistości wydaje się, że szybki próbuje promować ciągi, które będą traktowane mniej jak obiekty, a bardziej jak wartości. Nie oznacza to jednak, że pod maską swift nie traktuje łańcuchów jako obiektów, ponieważ jestem pewien, że wszyscy zauważyliście, że nadal można wywoływać metody na łańcuchach i używać ich właściwości.

Na przykład:-

//example of calling method (String to Int conversion)
let intValue = ("12".toInt())
println("This is a intValue now \(intValue)")


//example of using properties (fetching uppercase value of string)
let caUpperValue = "ca".uppercaseString
println("This is the uppercase of ca \(caUpperValue)")

W objectC możesz przekazać odwołanie do obiektu łańcuchowego przez zmienną, oprócz wywoływanych na nim metod, co prawie potwierdza fakt, że łańcuchy są obiektami czystymi.

Oto haczyk, gdy próbujesz spojrzeć na String jako obiekty, szybko nie możesz przekazać obiektu string przez referencję przez zmienną. Swift zawsze przekaże zupełnie nową kopię ciągu. W związku z tym łańcuchy są bardziej znane jako typy wartości w trybie szybkim. W rzeczywistości dwa literały łańcuchowe nie będą identyczne (===). Są traktowane jako dwie różne kopie.

let curious = ("ca" === "ca")
println("This will be false.. and the answer is..\(curious)")

Jak widać, zaczynamy odrywać się od konwencjonalnego sposobu myślenia o ciągach jako obiektach i traktowania ich bardziej jak wartości. Dlatego .isEqualToString, który został potraktowany jako operator tożsamości dla obiektów łańcuchowych, nie jest już poprawny, ponieważ nigdy nie można uzyskać dwóch identycznych obiektów łańcuchowych w Swift. Możesz jedynie porównać jego wartość lub innymi słowy sprawdzić równość (==).

 let NotSoCuriousAnyMore = ("ca" == "ca")
 println("This will be true.. and the answer is..\(NotSoCuriousAnyMore)")

Staje się to bardziej interesujące, gdy spojrzysz na zmienność obiektów łańcuchowych w szybki sposób. Ale to już kolejne pytanie, kolejny dzień. Coś, na co prawdopodobnie powinieneś spojrzeć, bo to naprawdę interesujące. :) Mam nadzieję, że to rozwiąże pewne zamieszanie. Twoje zdrowie!


4

Do porównania tekstu UITextField używam poniższego kodu i działa dobrze dla mnie, daj mi znać, jeśli znajdziesz jakiś błąd.

if(txtUsername.text.isEmpty || txtPassword.text.isEmpty)
{
    //Do some stuff
}
else if(txtUsername.text == "****" && txtPassword.text == "****")
{
    //Do some stuff
}

3

W isEmptyfunkcji Swift sprawdzi, czy łańcuch jest pusty.

 if username.isEmpty || password.isEmpty {
      println("Sign in failed. Empty character")
 }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.