Swift中带有可选完成块的函数[重复]

Posted

技术标签:

【中文标题】Swift中带有可选完成块的函数[重复]【英文标题】:Function with optional completion block in Swift [duplicate] 【发布时间】:2016-09-20 22:08:14 【问题描述】:

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

func foo(bar: String = "foobar") 

我想对完成块做同样的事情(使其成为可选)。我尝试了以下方法:

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)

我该怎么做?

编辑: 这是/曾经是重复的问题,抱歉。但是,我在原始问题中找不到解决方案。所以内森的答案是最好的一个

【问题讨论】:

【参考方案1】:

如果你想默认为nil

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


如果你的默认补全块很简单,你可以把它直接放在函数的定义中:

// 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) -> () =  ) 
    // ...

如果你的默认补全块比较复杂,你可以将它定义为一个单独的函数:

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


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


【讨论】:

这种情况下@escaping关键字应该放在哪里? @Rao 你不必这样做。默认情况下,可选闭包是@escaping。阅读更多关于它的信息here。【参考方案2】:

在 Swift 3 中:

func foo(completionBlock: (String) -> () =  _ in ) 

【讨论】:

这是否需要为completionBlock 使用@escaping,因为它从Swift3.0 开始就隐含地不可转义?

以上是关于Swift中带有可选完成块的函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 xib 中带有可选 UIImageView 的自定义 UITableViewCell

Laravel 5中带有可选参数的url中的两个斜杠

你可以在 Typescript 函数中有可选的解构参数吗?

PL/pg函数块

一个函数中带有 HTML(可选)按钮的 JavaScript 中的 if 表达式

Swift 可选属性声明之间的区别 [重复]