假设我有一个协议和一个符合该协议的类。
protocol Foo {
func task(success: (() -> Void)?)
}
class Bar: Foo {
func task(success: (() -> Void)?) {
//DO STUFF
}
}
成功关闭是可选的,因为不是每个调用都需要它。例如,在单元测试中调用此类函数时,这种情况很常见,因为我们希望在成功关闭中实现预期,而在常规调用中,由于某种原因不需要成功关闭。
由于协议中定义的函数的参数不能有默认值,对于符合Foo
的对象上的每个任务调用,我们必须用闭包来调用它,或者显式地传递nil作为闭包值:
var obj: Foo
obj = Bar()
obj.task(nil) //CLOSURE VALUE SET TO nil
obj.task() {} //EMPTY CLOSURE
obj.task() //NOT ALLOWED
实现这种结构的推荐方法是什么?我们是否需要每次传递空闭包,或者调用闭包值设置为零的函数,或者有其他方法来处理它?
我的推荐:
取而代之的是:
protocol Foo {
func task(success: (() -> Void)?)
}
使用此:
protocol Foo {
func task(success: () -> Void)
}
如果您不需要处理任务完成,那么您总是可以传递一个空闭包。可选的闭包只会让代码的意图变得不那么清晰。
下面是一个如何实现的示例。=nil可能没有必要,但我还没有测试过。
func doSomething(closure:(()->Void)? = nil) {
closure?()
}