Что такое Swift-эквивалент isEqualToString в Objective-C?

180

Я пытаюсь запустить следующий код:

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

Мой предыдущий код был в объективе C, который работал нормально:

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

Я предполагаю, что я не могу использовать isEqualToString в swift. Любая помощь будет оценена по достоинству. Спасибо.

Теги:
string

7 ответов

287
Лучший ответ

С Swift вам больше не нужно проверять равенство с помощью isEqualToString

Теперь вы можете использовать ==

Пример:

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

теперь isEqual имеет значение true.

Чтобы проверить идентичность (Спасибо Bryan для исправления) между объектами, используйте новый оператор ===. В этом случае x === y есть false, так как x и y не являются одной и той же переменной.

  • 35
    === это операторы тождественности, тогда как == это оператор равенства (по умолчанию вызывается isEqual: для NSObject и его подклассов)
  • 3
    Да, извините, "равенство", а не идентичность. Неправильное слово :)
Показать ещё 4 комментария
36

Используйте == вместо isEqual

Сравнение строк

Swift предоставляет три способа сравнения значений String: равенства строк, равенства префиксов и равенства суффиксов.

Равномерность строк

Два значения String считаются равными, если они содержат точно одинаковые символы в одном и том же порядке:

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

Для более подробной информации официальная документация Swift (поиск сравнивающих строк).

7

Я добавляю к @JJSaccolo ответ, вы можете создать собственный метод equals в качестве нового расширения строки, например:

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

И использование:

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

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

Конечно, исходный оператор == может быть лучше (работает как в Javascript), но для меня метод isEqual дает некоторую ясность кода, которую мы сравниваем с строками

Надеюсь, что это поможет кому-то,

7

В Swift оператор == эквивалентен Objective C isEqual: method (он вызывает метод isEqual вместо простого сравнения указателей, а там новый метод === для тестирования, что указатели одинаковы), поэтому вы может просто написать это как:

if username == "" || password == ""
{
    println("Sign in failed. Empty character")
}
  • 0
    в то время как это работает в swift - это вызовет хаос в objc, если / когда имя пользователя равно nil. Как предложено выше - используйте username.isEmpty, и где-то есть эквивалентный макрос isEmpty для цели c.
  • 0
    В Swift, если имя пользователя объявлено как String? (aka Необязательно <String>), тогда это не может быть ноль. В Objective C вы можете просто сказать, если ([длина имени пользователя] == 0 || [длина пароля] == 0) {...}, чтобы охватить ноль или пустые случаи.
4

На самом деле, похоже, что swift пытается рекламировать строки, которые будут обрабатываться менее похожими на объекты и больше похожими на ценности. Однако это не означает, что под капотом swift не обрабатывает строки как объекты, так как вы уверены, что все заметили, что вы все равно можете ссылаться на методы на строках и использовать их свойства.

Например: -

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

В objectC вы можете передать ссылку на объект строки через переменную, поверх методов вызова на ней, что в значительной степени устанавливает тот факт, что строки являются чистыми объектами.

Вот уловка, когда вы пытаетесь посмотреть на String как объекты, в swift вы не можете передать строковый объект по ссылке через переменную. Swift всегда будет передавать новую копию строки. Следовательно, строки более широко известны как типы значений в swift. Фактически, два строковых литерала не будут идентичны (===). Они рассматриваются как две разные копии.

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

Как вы можете видеть, мы начинаем нарушать традиционный способ мышления строк как объектов и относиться к ним скорее как ценности. Следовательно. IsEqualToString, который рассматривался как оператор идентификации для строковых объектов, уже недействителен, так как вы никогда не можете получить два одинаковых строковых объекта в Swift. Вы можете сравнить его значение или, другими словами, проверить равенство (==).

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

Это становится более интересным, если вы посмотрите на изменчивость строковых объектов в swift. Но это еще один вопрос, другой день. Что-то, на что вы, вероятно, должны смотреть, потому что это действительно интересно.:) Надеюсь, что прояснит некоторую путаницу. Ура!

2

В Swift функция isEmpty проверяет, пуста ли строка.

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

Для сравнения текста UITextField я использую ниже код и отлично работаю для меня, дайте мне знать, если вы найдете какую-либо ошибку.

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню