Swift协议中的可选闭包

时间:2016-04-19 14:21:39

标签: ios swift oop

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

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>

2 个答案:

答案 0 :(得分:0)

以下是您可以实施的示例。 = n可能没有必要,但我没有经过测试。

func doSomething(closure:(()->Void)? = nil) {
     closure?()
}

答案 1 :(得分:0)

我的建议:

而不是:

protocol Foo {
    func task(success: (() -> Void)?)
}

使用此:

protocol Foo {
    func task(success: () -> Void)
}

如果您不需要处理任务完成,则始终可以传递空闭包。可选的闭包只会使代码的意图变得不那么明确。