简而言之,(回答标题)不是。
详细说明:
对我来说,将它作为不强制解包的可选选项更有意义。 Apple 正在推动开发人员不要只使用optional!,并且只有将相同的规则应用于 API 才有意义。
这样做的原因是它可以为nil,如果用? 或! 声明来运行代码,它没有任何区别。使用! 实际上只是删除了 Xcode 中非常方便的警告,尤其是在涉及 API 代码时。如果您没有意识到它实际上是可选的,那您只是在自找麻烦。
现在使用 guard 检查 nil 也变得更好了,您可以将其与检查 "" 链接起来,因此实际上并没有更多的工作。
一般来说,可选值更好,因为 nil 不使用内存。我们得到的选项越多,我们的应用程序就越轻。
而且它看起来还不错,也不会增加厄运金字塔。
此示例将两个字符串都作为参数,删除 func 参数中的?,Xcode 将在那里警告您。
这部分我忘了直接回答:
当您将其设置为 nil 时,它变为 nil,您可能会这样做以节省一点内存。将其设置为 nil 而没有 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 = ""