传递闭包作为函数

时间:2017-11-07 08:56:33

标签: ios swift swift3

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

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()
       }
} 

我收到编译错误:

  

无默认参数值无法转换为' () ->'

如何实现我的需求?

2 个答案:

答案 0 :(得分:5)

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

func myAsycTask(name: String, callback: (() -> Void)? = nil)

答案 1 :(得分:1)

尝试进行回调关闭可选并删除 @escaping @escaping 注释是没有意义的,因为你的参数基本上是一个枚举(可选是一个包含2种情况的枚举: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?()
        }
    }
}