假设我有一个符合此协议的协议和类。
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
实施这种结构的推荐方法是什么?我们是否需要每次都传递空闭包,或者调用闭包值设置为nil的函数,还是有其他方法来处理它?</ p>
答案 0 :(得分:0)
以下是您可以实施的示例。 = n可能没有必要,但我没有经过测试。
func doSomething(closure:(()->Void)? = nil) {
closure?()
}
答案 1 :(得分:0)
我的建议:
而不是:
protocol Foo {
func task(success: (() -> Void)?)
}
使用此:
protocol Foo {
func task(success: () -> Void)
}
如果您不需要处理任务完成,则始终可以传递空闭包。可选的闭包只会使代码的意图变得不那么明确。