Estoy tratando de ejecutar el siguiente código:
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")
}
}
Mi código anterior estaba en Objective-C, que funcionaba bien:
if([[self.username text] isEqualToString: @""] ||
[[self.password text] isEqualToString: @""] ) {
Supongo que no puedo usar isEqualToString
en Swift. Cualquier ayuda sería apreciada.
===
es operadores de identidad mientras que==
es operador de igualdad (por defecto llamaisEqual:
a NSObject y sus subclases)'String' does not conform to protocol 'AnyObject'
.String
comparación. Xcode 6.4 le devuelve un errorBinary operator '===' cannot be applied to two String operands
Utilice el operador == en lugar de
isEqual
Comparar cadenas
Swift proporciona tres formas de comparar valores de cadena: igualdad de cadena, igualdad de prefijo e igualdad de sufijo.
Cadena de igualdad
Dos valores de cadena se consideran iguales si contienen exactamente los mismos caracteres en el mismo orden:
Para más información, lea la documentación oficial de Swift (busque Comparing Strings) .
fuente
Además de
@JJSaccolo
responder, puede crear unequals
método personalizado como una nueva extensión de cadena como:Y uso:
Seguro que el operador original
==
podría ser mejor (funciona como en Javascript), pero para mí elisEqual
método proporciona cierta claridad de código al comparar cadenasEspero que ayude a alguien,
fuente
En Swift, el operador == es equivalente al método isEqual: del objetivo C (llama al método isEqual en lugar de solo comparar punteros, y hay un nuevo método === para probar que los punteros son los mismos), por lo que puede escribir esto como:
fuente
En realidad, parece que Swift está tratando de promover cadenas para ser tratadas menos como objetos y más como valores. Sin embargo, esto no significa que bajo el capó veloz no trate las cadenas como objetos, ya que estoy seguro de que todos notaron que aún pueden invocar métodos en cadenas y usar sus propiedades.
Por ejemplo:-
En objectC, podría pasar la referencia a un objeto de cadena a través de una variable, además de los métodos de llamada, lo que prácticamente establece el hecho de que las cadenas son objetos puros.
Aquí está el truco cuando intentas mirar a String como objetos, en forma rápida no puedes pasar un objeto de cadena por referencia a través de una variable. Swift siempre pasará una copia nueva de la cadena. Por lo tanto, las cadenas se conocen más comúnmente como tipos de valor en swift. De hecho, dos literales de cadena no serán idénticos (===). Se tratan como dos copias diferentes.
Como puede ver, estamos comenzando a romper con la forma convencional de pensar las cadenas como objetos y tratarlos más como valores. Por lo tanto, .isEqualToString, que fue tratado como un operador de identidad para los objetos de cadena, ya no es válido, ya que nunca puede obtener dos objetos de cadena idénticos en Swift. Solo puede comparar su valor o, en otras palabras, verificar la igualdad (==).
Esto se vuelve más interesante cuando nos fijamos en la mutabilidad de los objetos de cadena en Swift. Pero eso es para otra pregunta, otro día. Algo que probablemente deberías considerar, porque es realmente interesante. :) Espero que eso aclare algo de confusión. ¡Salud!
fuente
Para la comparación de texto de UITextField que estoy usando el siguiente código y estoy trabajando bien para mí, avíseme si encuentra algún error.
fuente
En Swift, la
isEmpty
función verificará si la cadena está vacía.fuente