如何制作一个 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
Alamofire 请求最初返回值,但在通过完成处理程序时被接收为 nil