Swift协议中的可选闭包



假设我有一个协议和一个符合该协议的类。

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?()
}

最新更新