为什么在Swift 2中将UITextField的文本属性更改为可选项?

根据UIKit diff文档 ,在ios9 / Swift 2中

var text: String! 已成为var text: String?

根据UITextField的文档,它特别说

This string is @"" by default.

我不明白这个改变的目的。 如果文本字段根本不存在,该属性是不是总是空string? 这个字段在什么时候返回一个空string? 一旦用户与它交互? 一旦它被添加到视图层次? 它什么时候返回nil

如果文本字段首先存在,那么假设文本属性也是一样安全的? 这似乎会导致很多查找/replace.text.text!

我不知道文档中提到的是什么,所以也许有人会为了这个改变而有一些背景或帮助。

总之,(对标题的回答)不是。

详细:

对我来说,把它作为一个非强制解包的可选项是非常有意义的。 苹果推动开发者永远不要使用optional! 而且它们只适用于将相同的规则应用于API。

这是因为它可以是零,如果它被声明与它没有任何区别?! 用于运行代码。 使用! 实际上只是在Xcode中删除了这些非常方便的警告,特别是当涉及到API代码时。 如果你没有意识到它实际上是一个可选的,你只是要求麻烦。

现在检查零也是更好的guard ,你可以连锁检查""所以这不是更多的工作。

一般来说,可选项是更好的,因为零是不使用内存。 我们得到更多的select权,我们可以使我们的应用程序更轻。 而且它看起来并不坏,也不会增加厄运的金字塔。

这个例子将两个string作为参数,删除? 在func参数中,Xcode会在那里警告你。

我忘了直接回答这个部分: 当你把它设置为零时,你可能会做一些记忆, 只有没有select将其设置为零,没有xcode警告你正确处理它。 =>这是不可能的…

 var forcedUnwrappedString : String! = "" var optionalString : String? = "" forcedUnwrappedString = nil optionalString = nil func doSomethingWithString(string : String?) -> String? { guard var unwrappedString = string else { // error handling here return nil } let tempString = unwrappedString + "!" return tempString } func doSomethingUnsafeWithString(string : String) -> String { let tempString = string return tempString } var newString = doSomethingWithString(optionalString) var newString2 = doSomethingWithString(forcedUnwrappedString) newString = doSomethingUnsafeWithString(optionalString!) // this will crash without a warning fro xcode newString2 = doSomethingUnsafeWithString(forcedUnwrappedString) // this will crash without a warning fro xcode 

更新:

UITextfield的text属性有一个setter,在nil情况下总是设置为"" ,文档或UIKit .h文件中的任何地方都没有这个信息。

 var textField = UITextField(frame: CGRect(x: 0, y: 0, width: 0, height: 0)) var string = textField.text // string = "" textField.text = nil string = textField.text // string = "" 

解决这个问题的一个简单的方法是创build一个扩展到UITextField并使用它来代替.text属性。

 extension UITextField { var unwrappedText: String { return self.text ?? "" } } 

现在你可以说textfield.unwrappedText,而不必担心可选项。 (当然这只是为了读取值)。

门科提到自己,实际上不可能将text设置为零。 显然苹果希望它被logging为可空,尽pipe目前的实施,对我来说,这是没有任何意义的 – 我的意思是没有足够的意义给我。 问题是,苹果决定这绝对不是“错误的”,而是对每个人做事的优雅方式? 很明显不是。 如果你不同意他们的话,不要担心,对于你在苹果的一些决定上保留你的意见,这是完全正确的。

那么这个改变的目的是什么? 也许他们开始了一个内部规则,说永远不要让UIKits组件的任何属性不能为空,以免出现一致性问题。 也许他们认为在某些极端情况下,文本属性可能会因为内存压力而被释放。 无论他们是什么,我不认为他们是有效的,但我们必须服从。 然而,这并不能使我成为一个迷人的男孩。

你也可以使用unicode字符:

 extension UITextField { var teхt: String { //"х" is U+0445 unicode character return self.text ?? "" } }