swift 在闭包中展开先前选中的可选项时崩溃

8wigbo56  于 2023-09-30  发布在  Swift
关注(0)|答案(1)|浏览(117)

我有一个非常罕见的崩溃,可能涉及一个完美的时机(与关闭应用程序或进入后台状态?)这段代码的最后一行

fileprivate static func showNextDialog()
  {
    let next=futureDialogs.first
    if next != nil
    {
      futureDialogs.remove(next!)
      delay(0.01){showDialog(next!)}
    }
  }

导致下面的崩溃

#0  (null) in Swift runtime failure: Unexpectedly found nil while unwrapping an Optional value ()
#1  0x00000001049ff7ac in closure #1 in static InterfaceManager.showNextDialog() at ...
#2  (null) in partial apply for closure #1 in static InterfaceManager.showNextDialog() ()

函数delay如下:

func delay(_ delay:Double,_ closure:@escaping ()->())
{
  DispatchQueue.main.asyncAfter(
    deadline: DispatchTime.now() + Double(Int64(delay * Double(NSEC_PER_SEC))) / Double(NSEC_PER_SEC), execute: closure)
}

唯一的可选变量next是用let捕获的,并检查了nil。有人知道会发生什么吗?

xzlaal3s

xzlaal3s1#

next的类型是什么?它看起来像是一个引用类型,这意味着你不捕获它的值,而只是值的地址。
showNextDialog等待delay时,next的值可能会更改为nil。作为一种可能的修复方法,您可以在delay的完成处理程序中再次检查它是否为nil

delay(0.01) {
  if let next {
    showDialog(next)
  }
}

P.S.一个相关的小建议:避免强制解包,采用guard let/if let语法,而不是检查nil是否相等。

相关问题