【问题标题】:Pass a closure as an optional parameter of the function将闭包作为函数的可选参数传递
【发布时间】:2017-11-07 08:56:33
【问题描述】:

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

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 的默认参数值不能转换为类型'() ->'

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

【问题讨论】:

标签: ios swift swift3


【解决方案1】:

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

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

【讨论】:

  • 但是闭包不能是@escaping,因为它不再是闭包而是可选闭包。
  • 哦,很好看!谢谢!我自己并没有意识到这一点,很高兴知道。
【解决方案2】:

尝试让你的回调闭包可选并移除@escaping@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?()
        }
    }
}

【讨论】:

    猜你喜欢
    • 2019-11-01
    • 2012-05-22
    • 1970-01-01
    • 2015-07-22
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多