Ich versuche, den folgenden Code auszuführen:
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")
}
}
Mein vorheriger Code war in Objective-C, was gut funktionierte:
if([[self.username text] isEqualToString: @""] ||
[[self.password text] isEqualToString: @""] ) {
Ich nehme an, ich kann nicht isEqualToString
in Swift verwenden. Jede Hilfe wäre dankbar.
===
ist Identitätsoperatoren, während==
Gleichheitsoperator ist (standardmäßig AufrufisEqual:
von NSObject und seinen Unterklassen)'String' does not conform to protocol 'AnyObject'
.String
Vergleich. Xcode 6.4 gibt Ihnen einen Fehler zurückBinary operator '===' cannot be applied to two String operands
Verwenden Sie den Operator == anstelle von
isEqual
Strings vergleichen
Swift bietet drei Möglichkeiten zum Vergleichen von Zeichenfolgenwerten: Zeichenfolgengleichheit, Präfixgleichheit und Suffixgleichheit.
String-Gleichheit
Zwei String-Werte gelten als gleich, wenn sie genau dieselben Zeichen in derselben Reihenfolge enthalten:
Weitere Informationen finden Sie in der offiziellen Dokumentation von Swift (suchen Sie unter Vergleichen von Zeichenfolgen) .
quelle
Zusätzlich zur
@JJSaccolo
Antwort können Sie eine benutzerdefinierteequals
Methode als neue String-Erweiterung erstellen, wie:Und Verwendung:
Sicherlich
==
könnte der ursprüngliche Operator besser sein (funktioniert wie in Javascript), aber für michisEqual
bietet die Methode eine gewisse Code-Klarheit, dass wir Strings vergleichenHoffe es wird jemandem helfen,
quelle
In Swift entspricht der Operator == der Methode isEqual: von Objective C (er ruft die Methode isEqual auf, anstatt nur Zeiger zu vergleichen, und es gibt eine neue Methode === zum Testen, ob die Zeiger identisch sind), sodass Sie einfach schreiben können dies als:
quelle
Tatsächlich fühlt es sich so an, als würde Swift versuchen, Strings so zu fördern, dass sie weniger wie Objekte als vielmehr wie Werte behandelt werden. Dies bedeutet jedoch nicht, dass Swift unter der Haube Strings nicht als Objekte behandelt, da Sie alle sicher bemerkt haben, dass Sie weiterhin Methoden für Strings aufrufen und deren Eigenschaften verwenden können.
Beispielsweise:-
In objectC können Sie den Verweis auf ein Zeichenfolgenobjekt über eine Variable übergeben, zusätzlich zu den aufrufenden Methoden, wodurch die Tatsache, dass Zeichenfolgen reine Objekte sind, ziemlich genau belegt wird.
Hier ist der Haken, wenn Sie versuchen, String als Objekte zu betrachten. In Kürze können Sie ein String-Objekt nicht als Referenz durch eine Variable übergeben. Swift wird immer eine brandneue Kopie der Zeichenfolge übergeben. Daher werden Zeichenfolgen in Swift häufiger als Werttypen bezeichnet. Tatsächlich sind zwei Zeichenfolgenliterale nicht identisch (===). Sie werden als zwei verschiedene Kopien behandelt.
Wie Sie sehen, beginnen wir, uns von der herkömmlichen Art, Zeichenfolgen als Objekte zu betrachten und sie eher wie Werte zu behandeln, zu lösen. Daher ist .isEqualToString, das als Identitätsoperator für Zeichenfolgenobjekte behandelt wurde, nicht mehr gültig, da in Swift niemals zwei identische Zeichenfolgenobjekte abgerufen werden können. Sie können nur den Wert vergleichen oder mit anderen Worten auf Gleichheit prüfen (==).
Dies wird interessanter, wenn Sie die Veränderbarkeit von String-Objekten in Kürze betrachten. Aber das ist eine andere Frage, ein anderer Tag. Etwas, das Sie wahrscheinlich untersuchen sollten, weil es wirklich interessant ist. :) Hoffe das klärt etwas Verwirrung auf. Prost!
quelle
Für den UITextField-Textvergleich verwende ich den folgenden Code und arbeite gut für mich. Lassen Sie mich wissen, wenn Sie einen Fehler finden.
quelle
In Swift
isEmpty
prüft die Funktion, ob die Zeichenfolge leer ist.quelle