它以空字符串而不是nil开头。即使它明确地设置为nil,它仍然是一个空字符串。我不明白。也许通过分配nil来轻松清除?用它编写代码很笨重。
var textField = UITextField()
print(textField.text) // prints "Optional("")"
textField.text = nil
print(textField.text) // prints "Optional("")"
答案 0 :(得分:31)
这是历史性的事情。 UITextField
在空字符串和nil
字符串之间没有任何区别。在Objective-C中,没有必要在它们之间产生差异,因为您可以在Objective-C中调用nil
上的方法。
此外,Objective-C无法阻止用户将nil
分配给属性。
由此产生的合同是text
可以是可选的。在Objective-C中没有任何区别。
在Swift中我们无能为力,因为UITextField.text
契约必须改变,可能会破坏许多已编写的代码。请注意,即使从方法中永远不会返回nil
,您仍然可以指定nil
来重置该值。
您可以在旧API中找到数百种类似的情况。
答案 1 :(得分:19)
我对此感到非常强烈,我在重复我对Sulthan的答案的评论作为另一种答案。
我不确定Sulthan的回答是否能真正回答这个问题。
我无法"找到数百种类似情况。"那是因为他们已经不在了。他们在Swift 1中,但那是很久以前的事了。从那以后,API经过手工调整以消除它们。这个没有被淘汰。
手动调整API的整个想法是删除不必要的Optionals。数百个值理论上可以<xsl:template match="tei:div/tei:p">
<lg>
<xsl:apply-templates/>
</lg>
</xsl:template>
,但实际上永远不会,并且在Swift中它们不是 Optionals。 此值永远不会是nil
;即使Objective-C代码将其设置为nil
,它也不会成为nil
。并且在Swift中使其成为非可选的并不会打破&#34;无论如何。因此,它在Swift中是一个可选项毫无意义。
因此,我认为正确的答案是它是一个错误。在手动调整过程中的IUO去除期间,在Swift 2.0的准备阶段,标签和文本字段nil
应该被描述为非可选字符串,并且它不是。