在swift中,当变量可选时,你想什么时候使用!结束?或相反亦然。我理解他们之间的区别,但有些情况下哪一个不适合而另一个会不适合?
答案 0 :(得分:2)
如果您绝对确定在使用它时将其值设置为!
以外的其他值,则仅使用隐式展开的可选(nil
)。如果在设置为nil
时尝试访问隐式展开的可选项的值,则会触发运行时崩溃。
例如,这将编译:
var a: Int! = nil
var b = a + 1
但是,当您尝试拨打a + 1
时,它会崩溃。
但是,如果您使用标准的可选(?
),它会在编译时告诉您发生错误并在发生之前发现潜在的崩溃:
var a: Int? = nil
var b = a + 1 // Compile error here
当然,您可以在两种情况下检查nil
但是,如果您还需要检查nil
,为什么不使用更安全的标准选项并抓住您可能错过的任何检查在编译时,而不是在未来的某个未知点崩溃。
答案 1 :(得分:0)
当您知道值永远不会是!
(因为您测试该情况并处理它)时,可以使用隐式解包的选项(使用nil
声明的选项)但需要有一个可选的某些原因。我使用这些来捕获返回选项的Cocoa方法的结果,立即检查它们并处理错误情况,然后可以在没有解包操作符的情况下使用它们。
let myData: NSData! = NSDate(contentsOfFile: filePath)
if myData == nil {
// handle error reporting, etc
}
常规选项(用?
声明)应基本上用于其他任何您真正需要可选值的地方 - 否则会失去选项提供的安全性。
let myInt: Int? = myString.toInt()
当然,通过添加空合并运算符(??
),很多时候根本不需要可选项。
let myInt: Int = myString.toInt() ?? 0