【问题标题】: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。

    如果windownil,这将执行并且不会使您的应用崩溃。

    但是,使用! 会告诉您的应用程序始终将window 视为不是nil。如果window 不是nil,则语句将正确执行,但如果是nil,则应用程序将崩溃,因为您明确声明您永远不会期望它为零。

    总结一下,使用:

    window!.rootViewController = containerViewController
    

    当您总是希望窗口有效以设置您的rootViewController

    并使用:

    window?.rootViewController = containerViewController
    

    当您关心窗口的状态以及是否应该根据该状态执行语句时。

    【讨论】:

      猜你喜欢
      • 2012-02-10
      • 1970-01-01
      • 2010-12-08
      • 2018-12-23
      • 2021-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多