Я пытаюсь запустить код ниже:
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. Любая помощь будет оценена.
===
это операторы тождественности, тогда как оператор==
равенства (по умолчанию вызовisEqual:
NSObject и его подклассов)'String' does not conform to protocol 'AnyObject'
.String
сравнении. Xcode 6.4 возвращает вам ошибкуBinary operator '===' cannot be applied to two String operands
Используйте оператор == вместо
isEqual
Сравнение строк
Swift предоставляет три способа сравнения строковых значений: равенство строк, равенство префиксов и равенство суффиксов.
Строковое равенство
Два строковых значения считаются равными, если они содержат одинаковые символы в одинаковом порядке:
Подробнее читайте в официальной документации Swift (поиск Сравнение строк) .
источник
В дополнение к
@JJSaccolo
ответу, вы можете создать собственныйequals
метод как новое расширение String, например:И использование:
Конечно, оригинальный оператор
==
может быть лучше (работает как в Javascript), но для меняisEqual
метод дает некоторую ясность кода, что мы сравниваем строкиНадеюсь, это кому-нибудь поможет,
источник
В Swift оператор == эквивалентен isEqual: методу Objective C (он вызывает метод isEqual вместо простого сравнения указателей, и есть новый метод === для проверки того, что указатели совпадают), так что вы можете просто написать это как:
источник
На самом деле, кажется, что swift пытается продвигать строки, которые будут рассматриваться не как объекты, а как значения. Однако это не означает, что под капотом swift не рассматривает строки как объекты, так как уверен, что вы все заметили, что вы все равно можете вызывать методы для строк и использовать их свойства.
Например:-
В objectC вы можете передавать ссылку на строковый объект через переменную поверх вызывающих его методов, что в значительной степени устанавливает тот факт, что строки являются чистыми объектами.
Вот ловушка, когда вы пытаетесь посмотреть на String как на объекты, в swift вы не можете передать строковый объект по ссылке через переменную. Swift всегда будет передавать новую копию строки. Следовательно, строки более часто называются типами значений в swift. На самом деле два строковых литерала не будут идентичны (===). Они рассматриваются как две разные копии.
Как вы можете видеть, мы начинаем отходить от традиционного подхода к строкам как к объектам и относиться к ним как к ценностям. Следовательно, .isEqualToString, который обрабатывался как оператор идентичности для строковых объектов, больше не является допустимым, поскольку вы никогда не сможете получить два одинаковых строковых объекта в Swift. Вы можете только сравнить его значение или другими словами проверить на равенство (==).
Это становится более интересным, когда вы смотрите на изменчивость строковых объектов в swift. Но это для другого вопроса, другого дня. Что-то, что вы, вероятно, должны изучить, потому что это действительно интересно. :) Надеюсь, это прояснит ситуацию. Ура!
источник
Для сравнения текста UITextField я использую приведенный ниже код и отлично работаю для меня, дайте мне знать, если обнаружите какую-либо ошибку.
источник
В Swift
isEmpty
функция проверяет, пуста ли строка.источник