Mar*_*osc 89 optional-parameters swift
我试图在Swift中声明一个带有可选闭包的参数.我声明的函数如下所示:
class Promise {
func then(onFulfilled: ()->(), onReject: ()->()?){
if let callableRjector = onReject {
// do stuff!
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是Swift抱怨"条件中的绑定值必须是一个可选类型",其中声明了"if let".
Cez*_*zar 103
您应该将可选闭包括在括号中.这将适当地规范?
操作员.
func then(onFulfilled: ()->(), onReject: (()->())?){
if let callableRjector = onReject {
// do stuff!
}
}
Run Code Online (Sandbox Code Playgroud)
Evg*_*nii 53
为了使代码更短,我们可以在调用它时使用参数和可选链接的nil
默认值:onReject
?()
func then(onFulfilled: ()->(), onReject: (()->())? = nil) {
onReject?()
}
Run Code Online (Sandbox Code Playgroud)
这样我们可以onReject
在调用then
函数时省略参数.
then({ /* on fulfilled */ })
Run Code Online (Sandbox Code Playgroud)
我们还可以使用尾随闭包语法将onReject
参数传递给then
函数:
then({ /* on fulfilled */ }) {
// ... on reject
}
Run Code Online (Sandbox Code Playgroud)
Die*_*ngs 33
因为我假设,这个"可选"闭包应该什么都不做,你可以使用带有空闭包的参数作为默认值:
func then(onFulfilled: ()->(), onReject: ()->() = {}){
// now you can call your closures
onFulfilled()
onReject()
}
Run Code Online (Sandbox Code Playgroud)
现在可以使用或不使用onReject
回调来调用此函数
then({ ... })
then({ ... }, onReject: { ... })
Run Code Online (Sandbox Code Playgroud)
Optionals?
这里不需要Swift的棒极了!
也许这是一种更清洁的方式。特别是当闭包具有复杂的参数时。
typealias SimpleCallBack = () -> ()
class Promise {
func then(onFulfilled: SimpleCallBack, onReject: SimpleCallBack?){
if let callableRjector = onReject {
// do stuff!
}
}
}
Run Code Online (Sandbox Code Playgroud)