如何做一个可选的快速closures?

我试图在Swift中声明一个参数,它带有一个可选的闭包。 我已经声明的function如下所示:

class Promise { func then(onFulfilled: ()->(), onReject: ()->()?){ if let callableRjector = onReject { // do stuff! } } } 

但是Swift抱怨说:“在条件中的绑定值必须是一个可选types”,其中声明了“if let”。

您应该将可选闭包括在括号内。 这将适当的范围? 运营商。

 func then(onFulfilled: ()->(), onReject: (()->())?){ if let callableRjector = onReject { // do stuff! } } 

为了使代码更短,我们可以使用nil作为默认值onReject参数和可选的链接?()时调用它:

 func then(onFulfilled: ()->(), onReject: (()->())? = nil) { onReject?() } 

这样我们就可以在调用函数的时候省略onReject参数。

 then({ /* on fulfilled */ }) 

我们也可以使用尾随闭包语法来将onRejectparameter passingonReject函数:

 then({ /* on fulfilled */ }) { // ... on reject } 

这是一篇关于它的博客文章 。

由于我认为,这个“可选”闭包应该什么也不做,你可以使用一个空的闭包参数作为默认值:

 func then(onFulfilled: ()->(), onReject: ()->() = {}){ // now you can call your closures onFulfilled() onReject() } 

现在可以使用或不使用onRejectcallback来调用此函数

 then({ ... }) then({ ... }, onReject: { ... }) 

不需要Swift的真棒Optionals? 这里!

也许这是一个更清洁的方式。 特别是当闭包有复杂的参数时。

 typealias SimpleCallBack = () -> () class Promise { func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){ if let callableRjector = onReject { // do stuff! } } }