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

时间:2015-06-24 10:16:55

标签: ios objective-c swift nsdictionary swift-dictionary

我在Objective-C中有一个函数,如下所示

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

我想像这样将快速回调闭包传递给它:

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的类型。

如何通过参数

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

进入一个带有参数

的块的Objective-C函数
- (void) fetchChannelListForWatch:(void (^)(NSDictionary *))callback

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

NSDictionary的桥接类型是

[NSObject: AnyObject]

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

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

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

答案 1 :(得分:2)

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

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]?)
        }
}