Який еквівалент Swift isEqualToString в Objective-C?


271

Я намагаюся запустити код нижче:

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. Будь-яка допомога буде вдячна.

Відповіді:


427

Завдяки Swift вам більше не потрібно перевіряти рівність isEqualToString

Тепер ви можете використовувати ==

Приклад:

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

тепер isEqual is true.


37
===є операторами ідентичності, тоді ==як оператором рівності (за замовчуванням виклик isEqual:NSObject та його підкласів)
Bryan Chen

3
Так, вибачте, "рівність", а не особистість. Неправильне слово :)
JJSaccolo

1
Але, якщо я чогось не пропускаю, не здається, ви можете перевірити ідентичність між Strings : 'String' does not conform to protocol 'AnyObject'.

3
@ user1040049 Ви не можете порівнювати String з використанням оператора ===, тому що String in swift має тип структури, а не клас. Якщо ви вводите текст / рядок як NSString, ви можете порівняти, використовуючи оператор ===.
Санджана

3
@JJSaccolo ви насправді вводите в оману з частиною особи. Це питання про Stringпорівняння. Xcode 6.4 повертає вам помилкуBinary operator '===' cannot be applied to two String operands
Діма Деплов

47

Використовуйте оператор == замість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 (пошук Порівняння рядків) .


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

Сподіваюся, це допоможе комусь,


8

У Swift оператор == еквівалентний методу isEqual: Objective C (він називає метод isEqual замість того, щоб просто порівнювати покажчики, і є новий метод === для перевірки того, що покажчики однакові), тож ви можете просто написати це як:

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

поки це працює швидко - це спричинить хаос в objc, якщо / коли ім'я користувача буде нульовим. Як було запропоновано вище - використовуйте username.isEmpty і десь еквівалентний макрос порожній макрос для об'єкта c.
johndpope

У Swift, якщо ім'я користувача не оголошено як String? (він же необов’язковий <String>), тоді він не може бути нульовим. У Цілі C ви можете просто сказати, якщо ([довжина імені користувача] == 0 || [довжина пароля] == 0) {...} для покриття нульових або порожніх справ.
Нік Локвуд

6

Насправді, відчувається, що стрімкий намагається просувати рядки, щоб обробляти менше, як об'єкти і більше схожі на значення. Однак це не означає, що під стрімким капотом стринги не трактуються як об'єкти, так як я впевнений, що ви всі помітили, що ви все ще можете викликати методи на рядках та використовувати їх властивості.

Наприклад:-

//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 як об'єкти, у швидкому випадку ви не можете передавати рядковий об'єкт за посиланням через змінну. Свіфт завжди передасть абсолютно нову копію рядка. Отже, рядки більш відомі як типи значень у швидкій формі. Насправді два літеральні рядки не будуть однаковими (===). Вони розглядаються як дві різні копії.

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

Як ви бачите, ми починаємо відходити від звичайного способу мислення струн як предметів і ставимось до них як до цінностей. Отже,. Ви можете лише порівняти його значення або іншими словами перевірити рівність (==).

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

Це стає цікавішим, коли швидко дивишся на незмінність струнних об'єктів. Але це для іншого питання, іншого дня. Щось, напевно, варто подивитися, викликати його справді цікаво. :) Сподіваюся, що це усуне певну плутанину. Ура!


4

Для порівняння тексту UITextField я використовую код нижче і добре працює для мене, повідомте мене, якщо ви виявите помилку.

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

3

У isEmptyфункції Swift він перевірить, чи рядок порожній.

 if username.isEmpty || password.isEmpty {
      println("Sign in failed. Empty character")
 }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.