为什么在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 ?? "" } }
- “-webkit-overflow-scrolling:touch”打破了css的3D视angular
- Autolayout:添加约束到超级视图,而不是顶部布局指南?
- 在AppDelegate.m的屏幕上获取当前显示的UIViewController
- 声音不工作在iPhone模拟器?
- xcode / iOS:Autoresize填充视图 – 显式帧大小是必不可less的?
- 无声推送通知仅在设备充电和/或应用程序处于前台时才会提供
- iPhone核心数据保存时未解决的错误
- 调用performSeguewithIdentifier不会调用shouldperformseguewithIdentifier
- 删除iOSinput阴影