为什么是UITextField.text可选?
它从空string开始,而不是零。 即使明确设置为零,它仍然是一个空string。 我不明白。 也许可以通过分配nil来简化清除? 用它编写代码是笨重的。
var textField = UITextField() print(textField.text) // prints "Optional("")" textField.text = nil print(textField.text) // prints "Optional("")"
这是一个历史的事情。 UITextField
在空string和nil
string之间没有任何区别。 在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,而事实上并非如此。