【问题标题】:Pass a swift closure to an objective-C function which takes a block as parameter将 swift 闭包传递给以块为参数的目标 C 函数
【发布时间】:2015-06-24 10:16:55
【问题描述】:

我在 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] -> () 

进入一个带有参数的块的目标C函数

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

非常感谢您的帮助!

【问题讨论】:

  • 如果您只是在此处粘贴代码(并将其标记为这样)而不是使用图像,我们会更容易阅读。
  • @Eiko,感谢您的编辑!

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    NSDictionary 的桥接类型是

    [NSObject: AnyObject]
    

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

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

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

    【讨论】:

    • 嘿@Ben,感谢您提供的信息。但就我而言,replyHandler 是委托回调的一部分。特别是 WatchConnectivity 的 didReceiveMessage 函数。所以我无法更改我的replyHandler 的类型,将其转换为 ([NSObject : AnyObject]) -> Void) 也不起作用。你知道如何解决这个问题吗?谢谢!
    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 2022-01-16
    • 2021-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2019-11-01
    • 2014-02-10
    相关资源
    最近更新 更多