为什么UITextField.text是可选的?

时间:2017-03-17 15:14:55

标签: ios swift uitextfield

它以空字符串而不是nil开头。即使它明确地设置为nil,它仍然是一个空字符串。我不明白。也许通过分配nil来轻松清除?用它编写代码很笨重。

var textField = UITextField()
print(textField.text) // prints "Optional("")"
textField.text = nil
print(textField.text) // prints "Optional("")"

2 个答案:

答案 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应该被描述为非可选字符串,并且它不是。