为啥 UITextField.text 是可选的?

Posted

技术标签:

【中文标题】为啥 UITextField.text 是可选的?【英文标题】:Why Is UITextField.text An Optional?为什么 UITextField.text 是可选的? 【发布时间】:2017-03-17 15:14:54 【问题描述】:

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

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

【问题讨论】:

相关(重复?):Why was UITextField's text property changed to an optional in Swift 2? @MartinR 我认为不是重复的。这里的问题是为什么 text 是可选的,因为它从来都不是nilthere 的问题是如何 treat text 考虑到它 一个可选的。 @matt:至少密切相关。那里的标题是“为什么... @MartinR 但是没有一个答案能回答这个问题。它们只是关于如何(应对)。 Sulthan 是我见过的第一次尝试回答这个问题。 @matt:同意.. 【参考方案1】:

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

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

在 Swift 中我们无能为力,因为 UITextField.text 合约必须更改,可能会破坏许多已经编写好的代码。请注意,即使 nil 从未从该方法返回,您仍然可以分配 nil 来重置该值。

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

【讨论】:

那么,这是否意味着我可以随时强制打开它? @Verticon 不,您始终可以使用?? "" 在当前的 UIKit 实现中,text 永远不会为 nil。但是,它并没有这样记录,因此假设它可能是 nil 会更安全。 我不确定这是否真的回答了这个问题。我无法“找到数百个类似情况。”手动调整 API 的整个想法是删除不必要的 Optional。数百个值理论上可以是nil,但实际上永远不会,因此在 Swift 中它们不是可选的。 这个值永远不能是nil;即使 Objective-C 代码将其设置为 nil,它也不会变为 nil。在 Swift 中将其设为非可选不会“破坏”任何东西。所以它在 Swift 中是 Optional 是没有意义的。我认为正确的答案是这是一个错误。 调用field.text = nil 的Swift 代码只需替换为field.text = ""。并不比我们在 Swift 版本更新过程中所经历的数十次破坏更糟糕。 Objective-C 代码可以继续工作。【参考方案2】:

我对此感到非常强烈,因此我将重复我对 Sulthan 的回答的评论作为替代答案。

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

无法“找到数百个类似情况。”那是因为他们已经不在了。它们存在于 Swift 1 中,但那是很久以前的事了。从那时起,API 被手动调整以消除它们。这个没有被淘汰。

手动调整 API 的整个想法是删除不必要的 Optional。数百个值理论上可以是nil,但实际上永远不会,因此在 Swift 中它们不是可选的。 这个值永远不能是nil;即使 Objective-C 代码将其设置为 nil,它也不会变为 nil。在 Swift 中将其设为 nonOptional 不会“破坏”任何东西。所以它在 Swift 中是 Optional 是没有意义的。

因此,我认为正确的答案是它是一个错误。在 Swift 2.0 之前手动调整 API 的过程中移除 IUO 期间,标签和文本字段 text 属性应该被描述为非可选字符串,但它们不是。

【讨论】:

我喜欢它。希望 Swift 团队关注。 那么你觉得一直打开它有什么害处吗? @toddg 我总是强行打开它,这对没有任何伤害。 我已经提交了一个错误雷达#46580238 openradar.appspot.com/radar?id=6175370021699584 修复这个问题会很好,因为它没有任何意义。

以上是关于为啥 UITextField.text 是可选的?的主要内容,如果未能解决你的问题,请参考以下文章

Swift:如果变量 a 是非可选的,那么为啥变量 b 是可选的? [复制]

为啥在这种情况下 Array 的元素是可选的?

为啥在 C++ 中覆盖是可选的?

为啥 C# 3.0 对象初始值设定项构造函数括号是可选的?

为啥我们在 sql 中需要一个可选的关键字 OUTER? [复制]

使用 'var' 声明变量是可选的吗? [复制]