【问题标题】:What is the difference when change to use optional chaining replace forced unwrapping in swift?更改为使用可选链接替换 swift 中的强制展开时有什么区别?
【发布时间】:2015-07-31 04:02:09
【问题描述】:
当调用一个对象实例的函数时,该对象可能不存在(可选类型),似乎你总是可以在对象名后面加上一个问号,而不是在对象名后面加上一个感叹号,并且不崩溃。
window!.rootViewController = containerViewController // forced unwrapping
// Can change to question mark and not crash.
window?.rootViewController = containerViewController // Optional chaining
是不是在使用强制解包的地方,你总是可以改成使用可选链,结果是一样的?如果有,有什么区别?
【问题讨论】:
标签:
swift
forced-unwrapping
optional-chaining
【解决方案1】:
不同之处在于,通过使用?,您表示您希望它有时在 window 为 nil 时执行,有时在它不是时执行。换句话说,有一个 nil window 是一个有效的期望。
即,window? 表示窗口可能为零,也可能不为零。这意味着.rootViewController = containerViewController 可能不会执行,因为 window 为 nil。
如果window 是nil,这将执行并且不会使您的应用崩溃。
但是,使用! 会告诉您的应用程序始终将window 视为不是nil。如果window 不是nil,则语句将正确执行,但如果是nil,则应用程序将崩溃,因为您明确声明您永远不会期望它为零。
总结一下,使用:
window!.rootViewController = containerViewController
当您总是希望窗口有效以设置您的rootViewController时
并使用:
window?.rootViewController = containerViewController
当您关心窗口的状态以及是否应该根据该状态执行语句时。