Qual è l'equivalente Swift di isEqualToString in Objective-C?


271

Sto cercando di eseguire il codice qui sotto:

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

Il mio codice precedente era in Objective-C, che funzionava bene:

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

Presumo di non poterlo utilizzare isEqualToStringin Swift. Qualsiasi aiuto sarebbe apprezzato.

Risposte:


428

Con Swift non è più necessario verificare l'uguaglianza con isEqualToString

Ora puoi usare ==

Esempio:

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

ora è uguale true.


37
===è un operatore di identità mentre un operatore di ==uguaglianza (per impostazione predefinita chiama isEqual:NSObject e le sue sottoclassi)
Bryan Chen

3
Sì, scusa, "uguaglianza", non identità. Parola sbagliata :)
JJSaccolo

1
Ma, a meno che non mi manca qualcosa, non sembra è possibile testare l' identità tra le stringhe: 'String' does not conform to protocol 'AnyObject'.

3
@ user1040049 Non puoi confrontare String usando l'operatore === perché String in swift è di tipo struct non di classe. Se digiti cast il tuo testo / stringa come NSString puoi confrontare usando l'operatore ===.
sanjana,

3
@JJSaccolo sei davvero fuorviante con la parte identità. Questa domanda sul Stringconfronto. Xcode 6.4 ti restituisce un erroreBinary operator '===' cannot be applied to two String operands
Dima Deplov,

47

Utilizzare l' operatore == anzichéisEqual

Confronto tra stringhe

Swift offre tre modi per confrontare i valori String: uguaglianza stringhe, uguaglianza prefisso e uguaglianza suffisso.

Uguaglianza di stringa

Due valori String sono considerati uguali se contengono esattamente gli stessi caratteri nello stesso ordine:

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

Per maggiori informazioni leggi la documentazione ufficiale di Swift (cerca Confronto tra stringhe) .


13

Inoltre per @JJSaccolorispondere, è possibile creare un equalsmetodo personalizzato come nuova estensione String come:

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

E utilizzo:

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

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

Sicuramente l'operatore originale ==potrebbe essere migliore (funziona come in Javascript) ma per me il isEqualmetodo fornisce un po 'di chiarezza del codice che confrontiamo le stringhe

Spero che possa aiutare qualcuno


8

In Swift, l'operatore == equivale al metodo isEqual: obiettivo C (chiama il metodo isEqual invece di confrontare solo i puntatori, e c'è un nuovo metodo === per verificare che i puntatori siano gli stessi), quindi puoi semplicemente scrivere questo come:

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

mentre questo funziona rapidamente - causerà il caos in objc se / quando il nome utente è zero. Come suggerito sopra - usa username.isEmpty e c'è una macro isEmpty equivalente per l'obiettivo c da qualche parte.
johndpope,

In Swift, a meno che il nome utente non sia dichiarato String? (alias <String> opzionale) quindi non può essere nullo. Nell'obiettivo C puoi semplicemente dire se ([lunghezza nome utente] == 0 || [lunghezza password] == 0) {...} per coprire casi nulli o vuoti.
Nick Lockwood,

6

In realtà, sembra che swift stia cercando di promuovere le stringhe da trattare meno come oggetti e più come valori. Tuttavia, ciò non significa che sotto il cofano swift non tratti le stringhe come oggetti, come sicuramente avrete notato tutti che potete ancora invocare metodi sulle stringhe e usare le loro proprietà.

Per esempio:-

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

In objectC potresti passare il riferimento a un oggetto stringa attraverso una variabile, oltre ai metodi di chiamata su di esso, il che stabilisce praticamente il fatto che le stringhe sono oggetti puri.

Ecco il problema quando provi a guardare String come oggetti, in breve tempo non puoi passare un oggetto stringa per riferimento attraverso una variabile. Swift passerà sempre una nuova copia della stringa. Quindi, le stringhe sono più comunemente conosciute come tipi di valore in rapido. In effetti, due letterali stringa non saranno identici (===). Sono trattati come due copie diverse.

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

Come puoi vedere, stiamo iniziando a staccarci dal modo convenzionale di pensare le stringhe come oggetti e di trattarle più come valori. Quindi .isEqualToString che è stato trattato come un operatore di identità per oggetti stringa non è più valido in quanto non è possibile ottenere due oggetti stringa identici in Swift. Puoi solo confrontare il suo valore o in altre parole verificare l'uguaglianza (==).

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

Ciò diventa più interessante quando si osserva la mutabilità degli oggetti stringa in un attimo. Ma questo è per un'altra domanda, un altro giorno. Qualcosa che dovresti probabilmente esaminare, perché è davvero interessante. :) Spero che chiarisca un po 'di confusione. Saluti!


4

Per il confronto del testo UITextField sto usando il codice qui sotto e funziona bene per me, fammi sapere se trovi qualche errore.

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

3

In Swift la isEmptyfunzione controllerà se la stringa è vuota.

 if username.isEmpty || password.isEmpty {
      println("Sign in failed. Empty character")
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.