为什么String隐式变成String!在斯威夫特

时间:2015-06-23 07:53:04

标签: ios swift optional

我昨天收到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不重复。

3 个答案:

答案 0 :(得分:2)

您明确定义的String不是String!是...... String。很简单; - )

String!隐式解包的 Optional<String>

String?Optional<String>

Optional<T>表示它可以是TNothing类型的值(并且无法将任何内容与nil进行比较)。

因此,当您声明:

var text = ""

您声明了一个实际的字符串,它不能是nil。这就是编译器抱怨的原因:一个字符串不能是Nothing 。可以把它想象为比较StringCGFloat ......编译器会抱怨。

由于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进行比较时,编译器会抱怨。

此处解释了选项:Swift Programming Language/Basics/Optionals

答案 2 :(得分:1)

你的朋友肯定没有解决你的问题,他只是掩饰了它。

您声明了一个String类型的实例变量。 text始终是String。它永远不会是零。询问&#34;文字!= nil&#34;没有意义,因为它不能是零。它甚至不编译,因为一个字符串,总是为零,甚至不能检查是否为零。

你的朋友建议使用String?或字符串!在你的情况下,这完全是胡说八道。您的文本保证始终为String。而是将其更改为可能是String或nil的文本。这对您没有任何帮助。是的,现在你可以问它是否为零。之前,你甚至不必问。