Qual é o equivalente Swift de isEqualToString em Objective-C?

271

Estou tentando executar o código abaixo:

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

Meu código anterior estava no Objective-C, que estava funcionando bem:

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

Presumo que não posso usar isEqualToStringno Swift. Qualquer ajuda seria apreciada.

Gokhan Dilek
fonte

Respostas:

428

Com o Swift, você não precisa mais verificar a igualdade com isEqualToString

Agora você pode usar ==

Exemplo:

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

agora isEqual é true.

JJSaccolo
fonte
37
===é operadores de identidade enquanto ==é operador de igualdade (por chamada padrão isEqual:em NSObject e suas subclasses)
Bryan Chen
3
Sim, desculpe, "igualdade", não identidade. Palavra errada :)
JJSaccolo
1
Mas, a menos que eu estou faltando alguma coisa, não parece que você pode testar a identidade entre Cordas: 'String' does not conform to protocol 'AnyObject'.
3
@ user1040049 Não é possível comparar String usando o operador === porque String in swift é do tipo struct não classe. Se você digitar converter seu texto / string como NSString, poderá comparar usando o operador ===.
sanjana
3
@JJSaccolo você realmente engana com a parte da identidade. Esta pergunta sobre Stringcomparação. Xcode 6.4 retorna um erroBinary operator '===' cannot be applied to two String operands
Dima Deplov
47

Use o operador == em vez deisEqual

Comparando strings

Swift fornece três maneiras de comparar valores de String: igualdade de string, igualdade de prefixo e igualdade de sufixo.

Igualdade de Cordas

Dois valores de String são considerados iguais se contiverem exatamente os mesmos caracteres na mesma ordem:

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 mais, leia a documentação oficial do Swift (procure Comparing Strings) .

iPatel
fonte
13

Além de @JJSaccoloresponder, você pode criar um equalsmétodo personalizado como nova extensão String, como:

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

E uso:

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

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

Com certeza o operador original ==pode ser melhor (funciona como em Javascript), mas, para mim, o isEqualmétodo fornece alguma clareza de código que comparamos Strings

Espero que ajude alguém,

Maxim Shoustin
fonte
8

No Swift, o operador == é equivalente ao método isEqual: do Objetivo C (chama o método isEqual em vez de apenas comparar ponteiros, e há um novo método === para testar se os ponteiros são iguais), para que você possa escrever isso como:

if username == "" || password == ""
{
    println("Sign in failed. Empty character")
}
Nick Lockwood
fonte
enquanto isso funciona rapidamente - causará estragos na objc se / quando o nome de usuário for nulo. Como sugerido acima - use username.isEmpty e há uma macro isEmpty equivalente para o objetivo c em algum lugar.
Johndpope
No Swift, a menos que o nome de usuário seja declarado como String? (aka Opcional <>), então não pode ser nulo. No Objetivo C, você pode apenas dizer se ([comprimento do nome de usuário] == 0 || [comprimento da senha] == 0) {...} para cobrir casos nulos ou vazios.
Nick Lockwood
6

Na verdade, parece rápido tentar promover seqüências de caracteres para serem tratadas menos como objetos e mais como valores. No entanto, isso não significa que, por baixo do capô, o swift não trata as strings como objetos, como todos sabem que ainda é possível invocar métodos nas strings e usar suas propriedades.

Por exemplo:-

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

No objectC, você pode passar a referência a um objeto de string por meio de uma variável, além de chamar métodos, o que praticamente estabelece o fato de que strings são objetos puros.

Aqui está o problema quando você tenta olhar String como objetos, rapidamente você não pode passar um objeto string por referência através de uma variável. O Swift sempre passa uma cópia nova da string. Portanto, as strings são mais comumente conhecidas como tipos de valor rapidamente. De fato, dois literais de string não serão idênticos (===). Eles são tratados como duas cópias diferentes.

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

Como você pode ver, estamos começando a romper com o modo convencional de pensar em cordas como objetos e tratá-las mais como valores. Portanto, .isEqualToString, que foi tratado como um operador de identidade para objetos de string, não é mais válido, pois você nunca pode obter dois objetos de string idênticos no Swift. Você só pode comparar seu valor ou, em outras palavras, verificar a igualdade (==).

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

Isso fica mais interessante quando você olha para a mutabilidade de objetos de string rapidamente. Mas isso é para outra pergunta, outro dia. Algo que você provavelmente deveria procurar, porque é realmente interessante. :) Espero que isso esclareça alguma confusão. Felicidades!

Lakmal Caldera
fonte
4

Para a comparação de texto UITextField, estou usando o código abaixo e funcionando bem para mim, avise-me se encontrar algum erro.

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

Em Swift, a isEmptyfunção verifica se a sequência está vazia.

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