【问题标题】:How to extract a closure into typealias?如何将闭包提取到类型别名中?
【发布时间】:2018-03-20 07:47:02
【问题描述】:

我对 typealias 有点不知所措,以下代码块工作正常,我想将其重构为使用 typealias。

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

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

}

我想创建一个类型别名:

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

func vpnLoadHandler(complete: @escaping vpnCompleteClosure) {
}

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

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

无法转换 '(@escaping vpnCompleteClosure) -> ()' 类型的值 (aka '((Optional) -> ()) -> ()') 到预期的参数类型 '(错误?)-> 无效'

我错过了什么?

更新:

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

【问题讨论】:

  • 可以加loadFromPreferences(completionHandler: )签名
  • 好的,我已经添加了,谢谢
  • 类型别名是什么?您的 func vpnLoadHandler 不接受闭包参数。

标签: swift closures type-alias


【解决方案1】:

loadFromPreferences(completionHandler:) 需要一个参数,completion 类型为 (Error?) -> Void 您的 typealias 正在传递一个 ((Optional) -> Void) -> Void 您的错误是告诉您签名不匹配。

话虽如此,您需要弄清楚顶级方法的签名是什么。你在调用你的completionHandler 什么?你期望从中得到什么。

我不得不承认我对你将vpnLoadHandler(complete:) 传递给loadFromPreferences(completionHandler:) 的目的感到困惑

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

把你的typealias写成:

 typealias VPNCompletionHandler = (Error?) -> Void

 func vpnLoadHandler(completion: @escaping VPNCompletionHandler)

【讨论】:

    猜你喜欢
    • 2015-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-20
    • 2018-04-21
    • 1970-01-01
    相关资源
    最近更新 更多