string - What is the Swift equivalent of isEqualToString in Objective-C?


Translate

I am trying to run the code below:

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

My previous code was in Objective-C, which was working fine:

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

I assume I cannot use isEqualToString in Swift. Any help would be appreciated.


所有的回答
  • Translate

    With Swift you don't need anymore to check the equality with isEqualToString

    You can now use ==

    Example:

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

    now isEqual is true.


  • Translate

    Use == operator instead of isEqual

    Comparing Strings

    Swift provides three ways to compare String values: string equality, prefix equality, and suffix equality.

    String Equality

    Two String values are considered equal if they contain exactly the same characters in the same order:

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

    For more read official documentation of Swift (search Comparing Strings).


  • Translate

    I addition to @JJSaccolo answer, you can create custom equals method as new String extension like:

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

    And usage:

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

    For sure original operator == might be better (works like in Javascript) but for me isEqual method gives some code clearness that we compare Strings

    Hope it will help to someone,


  • Translate

    In Swift, the == operator is equivalent to Objective C's isEqual: method (it calls the isEqual method instead of just comparing pointers, and there's a new === method for testing that the pointers are the same), so you can just write this as:

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

  • Translate

    Actually, it feels like swift is trying to promote strings to be treated less like objects and more like values. However this doesn't mean under the hood swift doesn't treat strings as objects, as am sure you all noticed that you can still invoke methods on strings and use their properties.

    For example:-

    //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 you could pass the reference to a string object through a variable, on top of calling methods on it, which pretty much establishes the fact that strings are pure objects.

    Here is the catch when you try to look at String as objects, in swift you cannot pass a string object by reference through a variable. Swift will always pass a brand new copy of the string. Hence, strings are more commonly known as value types in swift. In fact, two string literals will not be identical (===). They are treated as two different copies.

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

    As you can see we are starting to break aways from the conventional way of thinking of strings as objects and treating them more like values. Hence .isEqualToString which was treated as an identity operator for string objects is no more a valid as you can never get two identical string objects in Swift. You can only compare its value, or in other words check for equality(==).

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

    This gets more interesting when you look at the mutability of string objects in swift. But thats for another question, another day. Something you should probably look into, cause its really interesting. :) Hope that clears up some confusion. Cheers!


  • Translate

    In Swift the isEmpty function it will check if the string is empty.

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

  • Translate

    For the UITextField text comparison I am using below code and working fine for me, let me know if you find any error.

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