当前位置: 首页 > 知识库问答 >
问题:

传递闭包作为函数的可选参数

南宫松
2023-03-14

我有一个函数,它有两个参数,最后一个参数是回调闭包:

func myAsycTask(name: String, callback: @escaping ()->Void) {
   myQueue.async{
      self.doTask(name)
      callback()
   }
} 

func doTask(name: String) {...}

我想让第二个回调闭包参数可选。我试图将上面的函数重新定义为:

func myAsycTask(name: String, callback: @escaping ()->Void? = nil) {
       myQueue.async{
          self.doTask(name)
          callback()
       }
} 

我收到编译器错误:

nil默认参数值不能转换为类型'()-

我怎样才能达到我需要的呢?


共有2个答案

束涵涤
2023-03-14

尝试将回调闭包设为可选的,并移除@escaping。@转义注释是没有意义的,因为你的参数基本上是一个枚举(可选的枚举有两种情况:some(Value)和none)。如果你的闭包属于另一个类型,它就是隐式转义。

import UIKit

// Also you can use a typealias to keep code more readable
typealias Callback = (() -> Void)

class Test {

    let myQueue = DispatchQueue(label: "com.playground")

    func doTask(name: String) {
        // something...
    }

    func myAsycTask(name: String, callback: Callback? = nil) {
        myQueue.async { [weak self] in
            self?.doTask(name: name)
            callback?()
        }
    }
}
殳阳飙
2023-03-14

您当前的代码意味着Void是闭包中的可选返回(这没有多大意义,因为ovid已经是空的)。您应该将参数括在括号中,然后将其设置为可选。

func myAsycTask(name: String, callback: (() -> Void)? = nil)
 类似资料:
  • 问题内容: 我试图了解Go在创建带有参数的匿名函数与将该函数用作闭包之间的区别。这是区别的一个例子。 带参数: 作为关闭: 我的问题是,第一种形式何时比第二种更好?您是否会为此类事情使用参数?我唯一看到第一种形式有用的是从另一个函数返回a时。 问题答案: 使用闭包与使用函数参数之间的区别在于共享同一变量与获取值的副本有关。请考虑下面的两个示例。 在 Closure中, 所有函数调用都将使用中存储的

  • 问题内容: 在Java中,我可以做类似的事情 然后稍后在方法中“运行”代码。处理(匿名内部类)很痛苦,但是可以做到。 Go是否有可以促进函数/回调作为参数传递的内容? 问题答案: 是的,请考虑以下示例: 播放:http://play.golang.org/p/XNMtrDUDS0 导览:https : //tour.golang.org/moretypes/25(函数闭包)

  • 我试图构造一个包含可选闭包的表。当我尝试实例化表的实例时,传递闭包的成员函数,我会得到一个编译错误。 从错误 msg 中可以看出,成员函数无法转换为可选的成员函数。我不明白为什么不;Int 或其他类型可以很容易地转换为可选类型。 无法转换类型为“”的值-

  • 我有两个功能。一个是,它以Int x和函数p作为参数,并返回布尔结果p(x)。就这么简单。 然后我有第二个函数,它就像 在调用时,有没有办法更改,使其像?(如果f返回true,则将其设为false) 比如: 我知道我可以通过masterChecker调用,但我想知道的是,是否可以更改作为参数传递的函数行为。

  • 问题内容: 如何在不执行“父”函数或不使用函数的情况下将函数作为参数传递?(因为我已经读到它是不安全的。) 我有这个: 它可以工作,但是问题是在调用函数时触发,而不是在函数中使用时触发。 根据我所读的内容,我可以使用来解决它,但这不是最佳实践。如何在JavaScript中将函数作为参数传递? 问题答案: 您只需要删除括号: 然后,这将传递函数而不先执行它。 这是一个例子:

  • 问题内容: 我已经熟悉Android框架和Java,并希望创建一个通用的“ NetworkHelper”类,该类可以处理大多数联网代码,使我能够从中调用网页。 我遵循了来自developer.android.com的这篇文章来创建我的网络类:http : //developer.android.com/training/basics/network- ops/connecting.html 码: