【问题标题】:How can I make a nil compatible completion handler?如何制作一个 nil 兼容的完成处理程序?
【发布时间】:2017-07-08 15:27:31
【问题描述】:

我创建了一个带有完成处理程序的函数。有时我需要使用完成块,有时不需要。

函数如下:

func numberCheck(number: String , completion : @escaping (Bool)->()){
     //some task do here 
    completion(true)
}

使用:

numberCheck(number: "77" , completion: {_ in
    //some task do here 
})

但我想让它完成块为零:

numberCheck(number: "77" ,  completion: nil)

但它给了我一个错误:

Nil 与预期的参数类型 '(Bool) -> ()' 不兼容

【问题讨论】:

  • 闭包的类型和其他类型一样,只需将其变成可选的附加?,以使变量能够容纳nil

标签: swift closures


【解决方案1】:

使闭包可选

func numberCheck(number: String , completion : @escaping ((Bool)->())?){

或者为了更好的可读性

typealias CheckResult = (Bool)->()

func numberCheck(number: String , completion : @escaping CheckResult? ){

但是你必须写在函数体中

completion?(true)

【讨论】:

  • 是否可以提供默认值.. 我想要默认值 false 。例如:typealias CheckResult = (Bool : true)->()
  • 不,不是。类型(别名)不是实例。
【解决方案2】:

只需将您的闭包参数设为可选,例如:

func numberCheck(number: String, completion: @escaping ((Bool)->())?)

另外,您可以设置一个默认值,如:

func numberCheck(number: String, completion: @escaping ((Bool)->())? = nil)

这样你就可以在不通知 nil 的情况下调用 completion 参数,简单地说:

numberCheck(number: "123")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2021-07-31
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2012-09-15
    相关资源
    最近更新 更多