为什么是UITextField.text可选?

它从空string开始,而不是零。 即使明确设置为零,它仍然是一个空string。 我不明白。 也许可以通过分配nil来简化清除? 用它编写代码是笨重的。

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

这是一个历史的事情。 UITextField在空string和nilstring之间没有任何区别。 在Objective-C中,不需要在它们之间做出区别,因为您可以在Objective-C中的nil上调用方法。

另外,Objective-C中没有办法阻止用户将nil分配给属性。 由此产生的合同是text可以是可选的。 在Objective-C中,没有任何区别。

在Swift中我们可以做的事情不多,因为UITextField.text约定不得不改变,可能会破坏大量已经写好的代码。 请注意,即使从未从方法返回nil ,仍可以分配nil来重置该值。

您可以在旧API中find数百个类似的情况。

我对此感到十分强烈,因此我正在重复对苏丹的回答作为替代答案的评论。

我不确定苏丹的答案是否真的回答了这个问题。

不能 “find几百个类似的情况”。 那是因为他们不在了。 他们在斯威夫特1那里,但那是很久以前的事了。 从那时起,这些API已经被手工调整,以消除它们。 这一个没有被淘汰。

手工调整API的整个想法是删除不必要的选项。 数百个价值理论上可以是nil但实际上从来不会是,而在斯威夫特,因此它们不是可选项。 这个值永远不会是nil ; 即使Objective-C代码将其设置nil ,也不会成为nil 。 在Swift中不可选“不会”破坏任何东西。 所以在Swift中它是一个可选项是没有意义的。

因此,我认为正确的答案是这是一个错误。 在手动调整Swift 2.0之前调整API的过程中,在去除IUO的过程中,标签和文本字段text应该被定义为非可选string,而事实上并非如此。