我试图在Swift中声明一个带有可选闭包的参数。我声明的函数如下所示:
class Promise {
func then(onFulfilled: ()->(), onReject: ()->()?){
if let callableRjector = onReject {
// do stuff!
}
}
}
但Swift抱怨&条件中的绑定值必须是一个可选类型"在哪里"如果让"被宣布。
答案 0 :(得分:99)
您应该将可选闭包括在括号中。这将适当地限定?
运算符。
func then(onFulfilled: ()->(), onReject: (()->())?){
if let callableRjector = onReject {
// do stuff!
}
}
答案 1 :(得分:50)
为了使代码更短,我们可以使用nil
作为onReject
参数的默认值,并在调用它时使用可选的链接?()
:
func then(onFulfilled: ()->(), onReject: (()->())? = nil) {
onReject?()
}
这样,当我们调用onReject
函数时,我们可以省略then
参数。
then({ /* on fulfilled */ })
我们还可以使用尾随闭包语法将onReject
参数传递给then
函数:
then({ /* on fulfilled */ }) {
// ... on reject
}
以下是关于它的blog post。
答案 2 :(得分:31)
因为我假设,这个“可选”闭包应该什么都不做,你可以使用带有空闭包的参数作为默认值:
func then(onFulfilled: ()->(), onReject: ()->() = {}){
// now you can call your closures
onFulfilled()
onReject()
}
现在可以使用或不使用onReject
回调
then({ ... })
then({ ... }, onReject: { ... })
这里不需要Swift很棒的Optionals?
!
答案 3 :(得分:2)
也许这是一种更清洁的方式。特别是当闭包有复杂的参数时。
typealias SimpleCallBack = () -> ()
class Promise {
func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){
if let callableRjector = onReject {
// do stuff!
}
}
}