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ć isEqualToString
w Swift. Każda pomoc będzie mile widziana.
===
jest operatorami tożsamości, podczas gdy==
jest operatorem równości (domyślnie wywołujeisEqual:
NSObject i jego podklasy)'String' does not conform to protocol 'AnyObject'
.String
porównanie. Xcode 6.4 zwraca błądBinary operator '===' cannot be applied to two String operands
Użyj operatora == zamiast
isEqual
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:
Więcej informacji można znaleźć w oficjalnej dokumentacji Swift (wyszukiwanie ciągów porównawczych) .
źródło
Oprócz
@JJSaccolo
odpowiedzi, możesz utworzyć niestandardowąequals
metodę jako nowe rozszerzenie String, takie jak:I użycie:
Na pewno oryginalny operator
==
może być lepszy (działa jak w Javascript), ale dla mnieisEqual
metoda daje pewną czytelność kodu, że porównujemy ciągiMam nadzieję, że to komuś pomoże
źródło
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:
źródło
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:-
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.
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ść (==).
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!
źródło
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.
źródło
W
isEmpty
funkcji Swift sprawdzi, czy łańcuch jest pusty.źródło