如何将闭包提取成类型?

时间:2018-03-20 07:47:03

标签: swift closures type-alias

我对于typealias有点迷失,以下代码块工作正常,我想重构为使用typealias。

NEVPNManager.shared().loadFromPreferences(completionHandler: vpnLoadHandler)

func vpnLoadHandler(_: (Error?)) -> Void {

}

我想创建一个typealias:

typealias vpnCompleteClosure = (_: (Error?)) -> Void

func vpnLoadHandler(complete: @escaping vpnCompleteClosure) {
}

NEVPNManager.shared().loadFromPreferences(completionHandler: vpnLoadHandler)

不幸的是,这不再编译了:

  

无法转换类型'的值(@escaping vpnCompleteClosure) - > ()”   (又名'((可选) - >()) - >()')到预期的参数类型   '(错误?) - >无效“

我错过了什么?

更新

open func loadFromPreferences(completionHandler: @escaping (Error?) -> Swift.Void)

1 个答案:

答案 0 :(得分:0)

loadFromPreferences(completionHandler:)期待参数completion类型为(Error?) -> Void您的typealias正在传递((Optional) -> Void) -> Void您的错误告诉您签名不匹配

话虽如此,你需要弄清楚顶级方法的签名是什么。你叫什么完成握手?你有什么期望从中得到回报。

我不得不承认我对将vpnLoadHandler(complete:)传递给loadFromPreferences(completionHandler:)

的目的感到困惑

您的方法最终会看起来像(((Error?)-> Void) -> Void) -> Void

将您的typealias写为:

 typealias VPNCompletionHandler = (Error?) -> Void

 func vpnLoadHandler(completion: @escaping VPNCompletionHandler)