如何制作一个 nil 兼容的完成处理程序?

Posted

技术标签:

【中文标题】如何制作一个 nil 兼容的完成处理程序?【英文标题】:How can I make a nil compatible completion handler? 【发布时间】: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 【参考方案1】:

使闭包可选

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

或者为了更好的可读性

typealias CheckResult = (Bool)->()

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

但是你必须写在函数体中

completion?(true)

【讨论】:

@cristainlika3 The Swift Programming Language 是否可以提供默认值.. 我想要默认值 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")

【讨论】:

以上是关于如何制作一个 nil 兼容的完成处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

从 swift 评估 javascript 函数,在完成处理程序中得到 nil

添加完成处理程序以防止结果“nil”

在完成处理程序中使用时显示 nil 的数组

Alamofire 请求最初返回值,但在通过完成处理程序时被接收为 nil

请求完成处理程序致命错误:在展开可选值异常时意外发现 nil

IOS Swift Amazon S3 传输实用程序 - nil 与预期的参数类型 nsurl 不兼容