【问题标题】:Compare the text of two text fields比较两个文本字段的文本
【发布时间】:2011-10-17 20:35:38
【问题描述】:

您如何比较两个文本字段中的文本以查看它们是否相同,例如“密码”和“确认密码”文本字段中的文本?

if (passwordField == passwordConfirmField) {

    //they are equal to each other

} else {

    //they are not equal to each other

}

【问题讨论】:

标签: objective-c ios cocoa-touch uitextfield string-comparison


【解决方案1】:

在 Objective-C 中你应该使用isEqualToString:,像这样:

if ([passwordField.text isEqualToString:passwordConfirmField.text]) {
    //they are equal to each other
} else {
    //they are *not* equal to each other
}

NSString 是指针类型。当您使用== 时,您实际上是在比较两个内存地址,而不是两个值。您的字段的 text 属性是 2 个不同的对象,具有不同的地址。
所以== 总是1 返回false


在 Swift 中,情况有些不同。 Swift String 类型符合 Equatable 协议。这意味着它通过实现运算符== 为您提供平等。使以下代码可以安全使用:

let string1: String = "text"
let string2: String = "text"

if string1 == string2 {
    print("equal")
}

如果string2 被声明为NSString 会怎样?

let string2: NSString = "text"

感谢StringNSString 在Swift 中的一些桥接,== 的使用仍然安全。


1:有趣的是,如果两个NSString 对象具有相同的值,编译器可能会在后台进行一些优化并重新使用相同的对象。所以在某些情况下,==可以返回true可能。显然这不是你想要依赖的东西。

【讨论】:

    【解决方案2】:

    您可以使用 NSString 的 isEqualToString: 方法来做到这一点,如下所示:

    NSString *password = passwordField.text;
    NSString *confirmPassword = passwordConfirmField.text;
    
    if([password isEqualToString: confirmPassword]) {
        // password correctly repeated
    } else {
        // nope, passwords don't match
    }
    

    希望这会有所帮助!

    【讨论】:

    • 这实际上会检查两个内存地址是否相等,而不是字符串的内容......所以它总是会在 ELSE 中结束
    • 你确定吗?根据我从文档中了解到的情况, isEqual: 将比较对象的哈希值。如果您使用它来比较 2 个字符串对象,它将起作用。但是知道这两个对象都是字符串,使用 isEqualToString 会更快:
    • 不,这不是真的。 isEqual 不会比较内存地址。它由它发送到的相应对象实现。在 NSString 的情况下,它确实比较了两个字符串的内容。见stackoverflow.com/questions/1292862/…
    • 没错,isEqualToString 更快。你应该更喜欢使用它。
    • 我的立场是正确的!我总是将 isEqual: 与比较对象相关联,而不是它们的内容......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多