Ios 将快速闭包传递给以块为参数的objective-C函数

Ios 将快速闭包传递给以块为参数的objective-C函数,ios,objective-c,swift,nsdictionary,swift-dictionary,Ios,Objective C,Swift,Nsdictionary,Swift Dictionary,我在objective-C中有一个函数,如下所示 - (void) fetchChannelListForWatch:(void (^)(NSDictionary *))callback 我想通过一个快速的回调结束,如下所示: fetchChannelListForWatch(replyHandler) 其中replyHandler是类型为的闭包 replyHandler: ([String : AnyObject]) -> Void) 我得到了一个错误: Cannot invoke

我在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的类型

如何使用参数传递swift闭包

replyHandler: [String: AnyObject] -> () 
转换为接受带参数块的objective-C函数

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

非常感谢你的帮助

NSDictionary的桥接类型为

[NSObject: AnyObject]
在您的情况下,您需要将
replyHandler
更新为

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

以下是相关文档

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

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

如果您只是将代码粘贴在这里(并将其标记为这样),而不是使用图像,我们将更容易阅读。@Eiko,谢谢您的编辑!嘿@Ben,谢谢你提供的信息。但在我的例子中,replyHandler是委托回调的一部分。特别是WatchConnectivity的didReceiveMessage函数。因此,我无法更改replyHandler的类型,将其强制转换为([NSObject:AnyObject])->Void也不起作用。你知道怎么避开这件事吗?谢谢