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 isEqualToString
dans Swift. Toute aide serait appréciée.
===
est un opérateur d'identité alors qu'il==
est un opérateur d'égalité (par défautisEqual:
sur NSObject et ses sous-classes)'String' does not conform to protocol 'AnyObject'
.String
comparaison. Xcode 6.4 vous renvoie une erreurBinary operator '===' cannot be applied to two String operands
Utilisez l' opérateur == au lieu de
isEqual
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:
Pour plus d' informations sur la documentation officielle de Swift (recherchez Comparing Strings) .
la source
En plus de
@JJSaccolo
répondre, vous pouvez créer uneequals
méthode personnalisée en tant que nouvelle extension de chaîne comme:Et l'utilisation:
Bien sûr, l'opérateur d'origine
==
pourrait être mieux (fonctionne comme en Javascript) mais pour moi, laisEqual
méthode donne une certaine clarté de code que nous comparons StringsJ'espère que cela aidera quelqu'un,
la source
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:
la source
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:-
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.
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é (==).
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é!
la source
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.
la source
Dans Swift, la
isEmpty
fonction vérifie si la chaîne est vide.la source