将 swift 闭包传递给以块作为参数的 objective-C 函数

Pass a swift closure to an objective-C function which takes a block as parameter

我在 objective-C 中有一个函数如下

- (void) fetchChannelListForWatch:(void (^)(NSDictionary *))callback

我想像这样传递一个 swift 回调闭包:

fetchChannelListForWatch(replyHandler)

其中 replyHandler 是一个闭包类型

replyHandler: ([String : AnyObject]) -> Void)

我收到错误:

Cannot invoke 'fetchChannelListForWatch' with an argument list of type '(([String : AnyObject]) -> Void)'

replyHandler 来自 WatchConnectivity 委托

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void)

所以我无法更改 replyHandler 的类型。

如何通过参数

传递我的 swift 闭包
replyHandler: [String: AnyObject] -> () 

进入一个 objective-C 函数,该函数采用带有参数

的块
- (void) fetchChannelListForWatch:(void (^)(NSDictionary *))callback

非常感谢您的帮助!

NSDictionary 的桥接类型是

[NSObject: AnyObject]

在您的情况下,您需要将 replyHandler 更新为

replyHandler: ([NSObject : AnyObject]) -> Void)

这里是相关文档https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/WorkingWithCocoaDataTypes.html

我认为这可能是解决您问题的捷径:

func session(session: WCSession, didReceiveMessage message: [String : AnyObject], replyHandler: ([String : AnyObject]) -> Void){
      let objCObject = ObjectiveCClass()

      objCObject.fetchChannelListForWatch { (dict) -> Void in
            replyHandler(dict as! [String : AnyObject]?)
        }
}