¿Cuál es el equivalente rápido de isEqualToString en Objective-C?

271

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 isEqualToStringen Swift. Cualquier ayuda sería apreciada.

Gokhan Dilek
fuente

Respuestas:

428

Con Swift ya no necesitas comprobar la igualdad con isEqualToString

Ahora puedes usar ==

Ejemplo:

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

ahora isEqual es true.

JJSaccolo
fuente
37
===es operadores de identidad mientras que ==es operador de igualdad (por defecto llama isEqual:a NSObject y sus subclases)
Bryan Chen
3
Sí, lo siento, "igualdad", no identidad. Palabra incorrecta :)
JJSaccolo
1
Pero, a menos que me falta algo, no parece que pueda probar la identidad entre las cuerdas: 'String' does not conform to protocol 'AnyObject'.
3
@ user1040049 No puede comparar String usando el operador === porque String en swift es de tipo struct no class. Si escribe emitir su texto / cadena como NSString, puede comparar usando el operador ===.
sanjana
3
@JJSaccolo, realmente eres engañoso con la parte de identidad. Esta pregunta sobre la Stringcomparación. Xcode 6.4 le devuelve un errorBinary operator '===' cannot be applied to two String operands
Dima Deplov
48

Utilice el operador == en lugar deisEqual

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:

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

Para más información, lea la documentación oficial de Swift (busque Comparing Strings) .

iPatel
fuente
13

Además de @JJSaccoloresponder, puede crear un equalsmétodo personalizado como una nueva extensión de cadena como:

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

Y uso:

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

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

Seguro que el operador original ==podría ser mejor (funciona como en Javascript), pero para mí el isEqualmétodo proporciona cierta claridad de código al comparar cadenas

Espero que ayude a alguien,

Maxim Shoustin
fuente
8

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:

if username == "" || password == ""
{
    println("Sign in failed. Empty character")
}
Nick Lockwood
fuente
Si bien esto funciona rápidamente, causará estragos en objc si / cuando el nombre de usuario es nulo. Como se sugirió anteriormente, use username.isEmpty y hay una macro isEmpty equivalente para el objetivo c en alguna parte.
johndpope
En Swift, a menos que el nombre de usuario se declare como String? (también conocido como Opcional <String>), entonces no puede ser nulo. En el Objetivo C puede decir si ([longitud de nombre de usuario] == 0 || [longitud de contraseña] == 0) {...} para cubrir casos nulos o vacíos.
Nick Lockwood
6

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

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

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.

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

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

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

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!

Caldera Lakmal
fuente
4

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.

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

En Swift, la isEmptyfunción verificará si la cadena está vacía.

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