Swift中比较字符串时的可选项与非可选项的区别

6

在Swift中比较字符串时,你可以把可选字符串和非可选字符串进行比较。

如下所示(text是一个可选项,且为空):

UITextField.text == "" // True

因为等号运算符自动解包字符串吗?

4
那是你实际的代码吗?因为 UITextField 类没有 text 属性。 - Wain
那只是一个例子。我已经初始化了一个UITextField,并且它有一个叫做text的属性。你可以在这里看到: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITextField_Class/ - WYS
1
没有拆包,可选项上也定义了等式,并且非可选项可以自动提升为可选项。 - Sulthan
看起来你把一个空值和一个空字符串混淆了。如果“text”变量是空的,那不等于一个空字符串,它意味着根本就没有字符串。所以你的测试应该失败。 - Alan
2个回答

24
对于每个遵循Equatable协议的类型,该协议也适用于可选类型的==操作符:
public func ==<T : Equatable>(lhs: T?, rhs: T?) -> Bool

右侧非可选项会自动提升为可选项。
对于可选项,使用==运算符时,当两个值都是nil或两个值均不为nil且相等时返回true

3
顺便提一下,Swift 3将删除带有可选参数的相应“比较”运算符:https://github.com/apple/swift-evolution/blob/master/proposals/0121-remove-optional-comparison-operators.md。 - Martin R

2
你的理论在以下例子中不成立:
let x: String? = nil

if x == "" {
    print("True")
} else {
    print("False") //Printed
}

这里实际上发生的是,在初始化时,text属性实际上从未为nil,而是一个空字符串,正如文档中所述:

此字符串默认为 @""。

Swift编译器不会隐式解包任何可选项,而是将这个责任留给程序员。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接