如何创建一个与@escaping 一起使用的闭包

How to create a closure to use with @escaping

我在委托上有这个函数签名

func session(_ session: WCSession, didReceiveUserInfo userInfo: [String : Any] = [:])

我需要在 Singleton 上创建一个闭包来转发该委托方法,然后我这样做:

typealias sessionDidReceiveUserInfoHandler = (WCSession, [String : Any]) -> Void
var sessionDidReceiveUserInfo: sessionDidReceiveUserInfoHandler?

我是这样使用它的:

let mySingleton = MySingleton.sharedInstance
mySingleton.sessionDidReceiveUserInfo = {(session, userInfo) in }

现在我有了带有 @escaping 子句的函数签名

func session(_ session: WCSession, didReceiveMessage message: [String : Any], replyHandler: @escaping ([String : Any]) -> Void) {

我该怎么做才能得到那个签名。 Xcode 不会让我像这样将转义添加到类型别名中:

typealias sessionDidReceiveMessageReplyHandlerHandler = (WCSession, [String : Any], @escaping ([String : Any])) -> Void

如果我创建了一个没有转义的类型别名,它不会让我在函数内部使用错误消息

Cannot convert value of type '([String : Any]) -> Void' to expected argument type '[String : Any]'

您在闭包上缺少一个 return 类型(即在最后一个 ) 中):

typealias sessionDidReceiveMessageReplyHandlerHandler = (WCSession, [String : Any], @escaping ([String : Any]) -> Void) -> Void