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

272

Я пытаюсь запустить код ниже:

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

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

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

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

Гохан Дилек
источник

Ответы:

429

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

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

Пример:

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

сейчас isEqual есть true.

JJSaccolo
источник
37
===это операторы тождественности, тогда как оператор ==равенства (по умолчанию вызов isEqual:NSObject и его подклассов)
Брайан Чен
3
Да, извините, «равенство», а не идентичность. Неправильное слово :)
JJSaccolo
1
Но, если я не хватает чего - то, это не кажется , вы можете проверить идентичность между строк: 'String' does not conform to protocol 'AnyObject'.
3
@ user1040049 Невозможно сравнить String с помощью оператора ===, поскольку String в swift имеет тип struct, а не class. Если вы наберете приведение вашего текста / строки как NSString, вы можете сравнить, используя оператор ===.
Санжана
3
@JJSaccolo вы действительно вводите в заблуждение с личностью. Этот вопрос о Stringсравнении. Xcode 6.4 возвращает вам ошибкуBinary operator '===' cannot be applied to two String operands
Дима Деплов
48

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

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

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

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

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

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 (поиск Сравнение строк) .

iPatel
источник
13

В дополнение к @JJSaccoloответу, вы можете создать собственный equalsметод как новое расширение String, например:

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метод дает некоторую ясность кода, что мы сравниваем строки

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

Максим Шустин
источник
8

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

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

На самом деле, кажется, что 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. Но это для другого вопроса, другого дня. Что-то, что вы, вероятно, должны изучить, потому что это действительно интересно. :) Надеюсь, это прояснит ситуацию. Ура!

Лакмальская кальдера
источник
4

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

if(txtUsername.text.isEmpty || txtPassword.text.isEmpty)
{
    //Do some stuff
}
else if(txtUsername.text == "****" && txtPassword.text == "****")
{
    //Do some stuff
}
Химаншу Падия
источник
3

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

 if username.isEmpty || password.isEmpty {
      println("Sign in failed. Empty character")
 }
jycr753
источник