有没有一种方法可以运行闭包而不进行测试?

时间:2019-08-25 17:39:10

标签: swift closures optional

我在课堂上不断使用这种方案

typealias nullHandle = ()->Void
var runOnLoad: nullHandle?

因此,当我创建该类的实例时,我会做...

let object = MyClass()
object.runOnLoad = { ()->Void in
  // do something
}

在类内部,我总是必须在运行该闭包之前执行此操作:

if self.runOnLoad != nil {
  self.runOnLoad()!
}     

因为我不能保证runOnLoad不是nil,如果我尝试运行nil runOnLoad,它将崩溃。

在使用Objective-C编程一个世纪之后,我是个新手。我正在迅速使用此模式,因为这是我在Objective-C中要做的。

在Swift中是否有更好的方法来完成这件事?

谢谢

1 个答案:

答案 0 :(得分:5)

Optional chaining也适用于闭包:

self.runOnLoad?()

如果不是nil,则执行关闭,否则不执行任何操作。

当然,您也可以测试闭包,但是最好使用可选绑定而不是强制展开:

if let runOnLoad = self.runOnLoad {
    runOnLoad()
}