Quel est l'équivalent Swift de isEqualToString dans Objective-C?

272

J'essaie d'exécuter le code ci-dessous:

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

Mon code précédent était en Objective-C, qui fonctionnait bien:

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

Je suppose que je ne peux pas l'utiliser isEqualToStringdans Swift. Toute aide serait appréciée.

Gokhan Dilek
la source

Réponses:

429

Avec Swift, vous n'avez plus besoin de vérifier l'égalité avec isEqualToString

Vous pouvez maintenant utiliser ==

Exemple:

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

maintenant isEqual est true.

JJSaccolo
la source
37
===est un opérateur d'identité alors qu'il ==est un opérateur d'égalité (par défaut isEqual:sur NSObject et ses sous-classes)
Bryan Chen
3
Oui, désolé, "égalité", pas identité. Mauvais mot :)
JJSaccolo
1
Mais, à moins que je me manque quelque chose, il ne semble pas que vous pouvez tester l' identité entre les chaînes: 'String' does not conform to protocol 'AnyObject'.
3
@ user1040049 Vous ne pouvez pas comparer String en utilisant l'opérateur === car String dans swift est de type struct et non de classe. Si vous tapez cast votre texte / chaîne en NSString, vous pouvez comparer en utilisant l'opérateur ===.
sanjana
3
@JJSaccolo vous trompe vraiment avec la partie identité. Cette question sur la Stringcomparaison. Xcode 6.4 vous renvoie une erreurBinary operator '===' cannot be applied to two String operands
Dima Deplov
48

Utilisez l' opérateur == au lieu deisEqual

Comparaison de chaînes

Swift propose trois façons de comparer les valeurs de chaîne: l'égalité de chaîne, l'égalité de préfixe et l'égalité de suffixe.

Égalité des cordes

Deux valeurs de chaîne sont considérées comme égales si elles contiennent exactement les mêmes caractères dans le même ordre:

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

Pour plus d' informations sur la documentation officielle de Swift (recherchez Comparing Strings) .

iPatel
la source
13

En plus de @JJSaccolorépondre, vous pouvez créer une equalsméthode personnalisée en tant que nouvelle extension de chaîne comme:

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

Et l'utilisation:

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

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

Bien sûr, l'opérateur d'origine ==pourrait être mieux (fonctionne comme en Javascript) mais pour moi, la isEqualméthode donne une certaine clarté de code que nous comparons Strings

J'espère que cela aidera quelqu'un,

Maxim Shoustin
la source
8

Dans Swift, l'opérateur == est équivalent à la méthode isEqual: d'Objective C (il appelle la méthode isEqual au lieu de simplement comparer des pointeurs, et il y a une nouvelle méthode === pour tester que les pointeurs sont les mêmes), donc vous pouvez simplement écrire ceci comme:

if username == "" || password == ""
{
    println("Sign in failed. Empty character")
}
Nick Lockwood
la source
bien que cela fonctionne rapidement - cela causera des ravages dans objc si / quand le nom d'utilisateur est nul. Comme suggéré ci-dessus - utilisez username.isEmpty et il y a une macro isEmpty équivalente pour l'objectif c quelque part.
johndpope
Dans Swift, sauf si le nom d'utilisateur est déclaré en tant que chaîne? (aka <String> facultatif), il ne peut pas être nul. Dans l'Objectif C, vous pouvez simplement dire si ([longueur du nom d'utilisateur] == 0 || [longueur du mot de passe] == 0) {...} pour couvrir les cas nuls ou vides.
Nick Lockwood
6

En fait, on a l'impression que Swift essaie de promouvoir les chaînes à traiter moins comme des objets et plus comme des valeurs. Cependant, cela ne signifie pas que sous le capot, Swift ne traite pas les chaînes comme des objets, car je suis sûr que vous avez tous remarqué que vous pouvez toujours invoquer des méthodes sur les chaînes et utiliser leurs propriétés.

Par exemple:-

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

Dans objectC, vous pouvez passer la référence à un objet chaîne via une variable, en plus d'appeler des méthodes dessus, ce qui établit à peu près le fait que les chaînes sont des objets purs.

Voici le hic quand vous essayez de regarder String en tant qu'objets, en rapide vous ne pouvez pas passer un objet chaîne par référence à travers une variable. Swift transmettra toujours une toute nouvelle copie de la chaîne. Par conséquent, les chaînes sont plus communément appelées types de valeurs dans swift. En fait, deux littéraux de chaîne ne seront pas identiques (===). Ils sont traités comme deux copies différentes.

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

Comme vous pouvez le voir, nous commençons à nous éloigner de la façon conventionnelle de penser les cordes comme des objets et de les traiter davantage comme des valeurs. Par conséquent .isEqualToString qui a été traité comme un opérateur d'identité pour les objets chaîne n'est plus valide car vous ne pouvez jamais obtenir deux objets chaîne identiques dans Swift. Vous ne pouvez comparer que sa valeur, ou en d'autres termes vérifier l'égalité (==).

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

Cela devient plus intéressant lorsque vous regardez la mutabilité des objets chaîne dans swift. Mais c'est pour une autre question, un autre jour. Quelque chose que vous devriez probablement étudier, car c'est vraiment intéressant. :) J'espère que cela dissipe une certaine confusion. À votre santé!

Lakmal Caldera
la source
4

Pour la comparaison de texte UITextField que j'utilise ci-dessous et qui fonctionne bien pour moi, faites-moi savoir si vous trouvez une erreur.

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

Dans Swift, la isEmptyfonction vérifie si la chaîne est vide.

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