Was ist das Swift-Äquivalent von isEqualToString in Objective-C?

271

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 isEqualToStringin Swift verwenden. Jede Hilfe wäre dankbar.

Gokhan Dilek
quelle

Antworten:

427

Mit Swift müssen Sie die Gleichheit nicht mehr überprüfen isEqualToString

Sie können jetzt verwenden ==

Beispiel:

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

jetzt ist gleich true.

JJSaccolo
quelle
37
===ist Identitätsoperatoren, während ==Gleichheitsoperator ist (standardmäßig Aufruf isEqual:von NSObject und seinen Unterklassen)
Bryan Chen
3
Ja, sorry, "Gleichheit", keine Identität. Falsches Wort :)
JJSaccolo
1
Aber wenn mir nichts fehlt, können Sie das anscheinend nicht testen Identität zwischen den Zeichenfolgen : 'String' does not conform to protocol 'AnyObject'.
3
@ user1040049 Sie können String nicht mit dem Operator === vergleichen, da String in swift vom Typ struct not class ist. Wenn Sie cast Ihren Text / String als NSString eingeben, können Sie ihn mit dem Operator === vergleichen.
Sanjana
3
@JJSaccolo Sie wirklich irreführend mit Identitätsteil. Diese Frage zum StringVergleich. Xcode 6.4 gibt Ihnen einen Fehler zurückBinary operator '===' cannot be applied to two String operands
Dima Deplov
47

Verwenden Sie den Operator == anstelle vonisEqual

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:

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

Weitere Informationen finden Sie in der offiziellen Dokumentation von Swift (suchen Sie unter Vergleichen von Zeichenfolgen) .

iPatel
quelle
13

Zusätzlich zur @JJSaccoloAntwort können Sie eine benutzerdefinierte equalsMethode als neue String-Erweiterung erstellen, wie:

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

Und Verwendung:

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

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

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 vergleichen

Hoffe es wird jemandem helfen,

Maxim Shoustin
quelle
8

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:

if username == "" || password == ""
{
    println("Sign in failed. Empty character")
}
Nick Lockwood
quelle
Während dies schnell funktioniert, wird es in objc Chaos verursachen, wenn / wenn der Benutzername gleich Null ist. Wie oben vorgeschlagen - verwenden Sie username.isEmpty und es gibt irgendwo ein gleichwertiges isEmpty-Makro für Ziel c.
Johndpope
In Swift, es sei denn, der Benutzername ist als String deklariert? (aka Optional <String>) dann kann es nicht Null sein. In Ziel C können Sie einfach sagen, ob ([Länge des Benutzernamens] == 0 || [Länge des Passworts] == 0) {...}, um null oder leere Fälle abzudecken.
Nick Lockwood
6

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

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

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.

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

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 (==).

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

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!

Lakmal Caldera
quelle
4

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.

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

In Swift isEmptyprüft die Funktion, ob die Zeichenfolge leer ist.

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