在Objective-C中,isEqualToString的Swift等效项是什么?


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中使用。任何帮助,将不胜感激。

Answers:


427

使用Swift,您不再需要检查是否与 isEqualToString

您现在可以使用 ==

例:

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

现在isEqual是true


37
===是身份运算符,==而是相等运算符(默认调用isEqual:NSObject及其子类)
Bryan Chen

3
是的,对不起,“平等”,而不是身份。错误词:)
JJSaccolo 2014年

1
但是,除非我丢失了某些内容,否则似乎无法测试Strings:之间的身份'String' does not conform to protocol 'AnyObject'

3
@ user1040049您不能使用===运算符来比较String,因为swift中的String属于struct not class类型。如果键入将文本/字符串转换为NSString,则可以使用===运算符进行比较。
sanjana 2015年

3
@JJSaccolo您真的会误导身份部分。这个问题String比较一下。Xcode 6.4返回错误Binary operator '===' cannot be applied to two String operands
Dima Deplov

47

使用==运算符代替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的官方文档(搜索比较字符串)


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中,==运算符等效于Objective C的isEqual:方法(它调用isEqual方法而不是仅比较指针,并且有一个新的===方法用于测试指针是否相同),因此您可以编写这是:

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

尽管此操作迅速有效-如果/当用户名为nil时,它将在objc中造成严重破坏。如上所述,请使用username.isEmpty,在目标c处有一个等效的isEmpty宏。
johndpope

在Swift中,除非用户名声明为String?(aka Optional <String>),则不能为nil。在目标C中,您只可以说是否([username length] == 0 || [password length] == 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将始终传递该字符串的全新副本。因此,字符串更迅速地被称为值类型。实际上,两个字符串文字将不相同(===)。它们被视为两个不同的副本。

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

快速查看字符串对象的可变性时,这会变得更加有趣。但这就是另一个问题,又是一天。您可能应该研究的东西,使其真正有趣。:)希望能消除一些困惑。干杯!


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")
 }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.