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