具有Swift中可选完成块的功能

nto*_*nio 35 completionhandler swift

当我创建一个函数时,我可以通过给它一个默认值来使参数成为可选参数,如下所示:

func foo(bar: String = "foobar") {}
Run Code Online (Sandbox Code Playgroud)

我想用完成块做同样的事情(使它成为可选项).我尝试过以下方法:

func foo(completionBlock: (foo: String) -> () = () -> ())
func foo(completionBlock: (foo: String) -> () = (foo: String) -> ())
func foo(completionBlock: (foo: String) -> () = ((foo: String) -> ()))
func foo(completionBlock: (foo: String) -> () = ((foo: String) in))
func foo(completionBlock: (foo: String) -> () = {(foo: String) in})
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

编辑:
这是一个重复的问题,对不起.但是,我在原始问题中找不到解决方案.所以nathan的答案是最好的答案

Cod*_*ent 40

如果您要默认为nil:

func foo(completionBlock: ((String) -> ())? = nil) {

}
Run Code Online (Sandbox Code Playgroud)

如果您的默认完成块非常简单,您可以使用闭包:

// A default completion block that is simple enough to fit on one line
func foo(completionBlock: (String) -> () = { result in print(result) }) {
    // ...
}

// A default completion block that does nothing
func foo(completionBlock: (String) -> () = {} ) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

如果您的默认完成块长于一行,最好将其分解为自己的函数:

func defaultCompletion(result: String) {
    // ...
}

func foo(completionBlock: ((String) -> ()) = defaultCompletion) {

}
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,我应该在哪里放置`@escaping`关键字? (10认同)
  • @Rao你不必.默认情况下,可选的闭包是`@escaping`.阅读更多相关信息[这里](https://www.jessesquires.com/blog/why-optional-swift-closures-are-escaping/). (10认同)

nat*_*ter 39

在Swift 3中:

func foo(completionBlock: (String) -> () = { _ in }) {}
Run Code Online (Sandbox Code Playgroud)

  • 这不需要一个@escaping用于completionBlock,因为它自Swift3.0以来一直隐含地不转义吗? (6认同)