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

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)

  • 可能会消除歧义.如果可选的闭包有一个返回值,那么`( - ) - > Int?`的意思可能会令人困惑. (4认同)
  • 另外,从Swift书中可以看出:"在声明可选类型时,请务必使用括号来正确定位?运营商.例如,要声明一个可选的整数数组,请将类型注释写为(Int [])?; 写Int []?产生错误." (3认同)

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的棒极了!


Sei*_*ahi 7

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

typealias SimpleCallBack = () -> ()

class Promise {

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

}
Run Code Online (Sandbox Code Playgroud)