我昨天收到Xcode的编译错误,说
二元运算符'&&'不能应用于两个Bool操作数 [1]
在
if text != nil && presentingViewController != nil {
...
}
text
早先定义为
var text: String = "" {
didSet {
...
}
}
和presentingViewController
来自UIViewController
,即super
类。
我的一位朋友告诉我,这是由text
String!
引起的,问题是通过更改来解决的
var text: String
到
var text: String?
但是,为什么我明确定义的String
成为String!
仍然让我感到困惑。任何人都可以提供有关此隐式转换的任何细节吗?
[1]此编译错误没有意义,此问题与another question of the same compilation error不重复。
答案 0 :(得分:2)
您明确定义的String
不是String!
是...... String
。很简单; - )
String!
是隐式解包的 Optional<String>
String?
是Optional<String>
Optional<T>
表示它可以是T
或Nothing
类型的值(并且无法将任何内容与nil
进行比较)。
因此,当您声明:
var text = ""
您声明了一个实际的字符串,它不能是nil
。这就是编译器抱怨的原因:一个字符串不能是Nothing
。可以把它想象为比较String
和CGFloat
......编译器会抱怨。
由于String!
是Optional<String>
,因此可以与nil
进行比较。
!
只是在宣布您完全确定它不是Nothing
,以便您可以在不使用展开其实际值的情况下使用text
。
BTW,不要与""
混淆和清空字符串(即:Nothing
)。
var text = ""
实际为String
只是空的,与Nothing
无法比较
希望这有帮助。
答案 1 :(得分:2)
您的问题与swift中所谓的“选项”有关。
在Objective-C中,您可以引用NSString,它可以指向NSString实例 - 或者指向nil。在swift中,这是不同的!
swift中的“常规”字符串永远不能为零。只有“可选”字符串才能为零。这就是它在swift代码中的样子:
var myRegularString : String // this can never be nil, can't compare to nil
var myOptionalString : String? // this can be nil (note the ?)
你有一个“常规”字符串。因此,当您尝试将其与nil进行比较时,编译器会抱怨。
答案 2 :(得分:1)
你的朋友肯定没有解决你的问题,他只是掩饰了它。
您声明了一个String类型的实例变量。 text始终是String。它永远不会是零。询问&#34;文字!= nil&#34;没有意义,因为它不能是零。它甚至不编译,因为一个字符串,总是为零,甚至不能检查是否为零。
你的朋友建议使用String?或字符串!在你的情况下,这完全是胡说八道。您的文本保证始终为String。而是将其更改为可能是String或nil的文本。这对您没有任何帮助。是的,现在你可以问它是否为零。之前,你甚至不必问。