为什么UITextField.text是可选的?

Ver*_*con 30 uitextfield ios swift

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

var textField = UITextField()
print(textField.text) // prints "Optional("")"
textField.text = nil
print(textField.text) // prints "Optional("")"
Run Code Online (Sandbox Code Playgroud)

Sul*_*han 34

这是历史性的事情.UITextField空字符串和nil字符串之间没有任何区别.在Objective-C中,没有必要在它们之间产生差异,因为您可以nil在Objective-C中调用方法.

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

在Swift中,我们无能为力,因为UITextField.text合同必须改变,可能会破坏许多已编写的代码.请注意,即使nil从方法中永远不返回,您仍然可以指定nil重置该值.

您可以在旧API中找到数百种类似的情况.

  • 我不确定这真的回答了这个问题.我_不能"找到数百个类似的情况." 手动调整API的整个想法是删除不必要的Optionals.数百个值可以理论上是"零"但实际上永远不会是,并且在Swift中它们因此是_not_ Optionals._This_值永远不会是'nil`; 即使Objective-C代码将其设置为"nil",它也不会变为"nil".并且在Swift中使它成为nonOptional并不会"破坏"任何东西.所以在Swift中它是一个可选项是没有意义的.我认为正确的答案是它是一个错误. (6认同)
  • 调用`field.text = nil`的Swift代码只需要用`field.text =""`代替.在Swift版本更新过程中,我们已经经历了数十次破坏,这并不比这更糟糕.而Objective-C代码可以继续工作. (6认同)
  • @Verticon不,你可以随时使用`?? ""`. (5认同)
  • 那么,这是否意味着我总是可以强行打开它? (2认同)
  • 在当前的UIKit实现中,`text`永远不会是nil.但是,它没有记录,所以假设它可能是零是更安全的. (2认同)

mat*_*att 21

我对此感到非常强烈,我正在重复我对Sulthan的答案的评论作为另一种答案.

我不确定Sulthan的答案是否真的回答了这个问题.

不能 "找到数百个类似的情况." 那是因为他们已经不在了.他们在Swift 1中,但那是很久以前的事了.从那以后,API经过手工调整以消除它们.这个没有消除.

手动调整API的整个想法是删除不必要的Optionals.理论上可以有数百个值,nil但实际上从来都不会,因此在Swift中它们不是选项.这个值永远不会是nil; 即使Objective-C代码设置它nil,它也不会成为nil.并且在Swift中使它成为nonOptional并不会"破坏"任何东西.所以在Swift中它是一个可选项是没有意义的.

因此,我认为正确的答案是它是一个错误.在手动调整过程中的IUO去除期间,在Swift 2.0的准备阶段,标签和文本字段text应该被描述为非可选字符串,而事实并非如此.

  • @toddg我总是强行打开它,这从来没有做过_me_任何伤害. (2认同)