如何在swift中创建一个可选的闭包?

时间:2014-06-24 20:39:51

标签: swift optional-parameters

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

class Promise {

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

}

但Swift抱怨&条件中的绑定值必须是一个可选类型"在哪里"如果让"被宣布。

4 个答案:

答案 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! 
    }
}

}