在 objective c 中调用 Swift 完成处理程序

Call Swift completion handler in objective c

我正在尝试调用一个 swift 方法,它是这样实现的:-

@objc class DataAPI: NSObject {
    func makeGet(place:NSString , completionHandler: (String! , Bool!) -> Void)
    {
        var str:String = ""
        let manager = AFHTTPSessionManager()

        manager.GET("https://api.com", parameters: nil, success:
              { (operation, responseObject) -> Void in
                        str = "JSON:  \(responseObject!.description)"
                        print(str)

                        completionHandler(str,false)   //str as response json, false as error value

            },
                    failure: { (operation,error: NSError!) in
                        str = "Error: \(error.localizedDescription)"
                        completionHandler("Error",true)   
        })

    }}

现在,当我尝试在我的 Objective C class 中调用它时,它抛出错误 "No Visible interface for DataAPI declares selector makeGet:completionHandler"

这就是我在 Objective C class 中调用方法的方式:-

[[DataAPI  new] makeGet:@"" completionHandler:^{
}];

我看到在 Swift 中完成处理程序有两个参数:StringBool 而在你的 Objective-C 调用中你传递了一个没有任何参数的块。我认为这可能是错误的原因。

尝试:

[[DataAPI  new] makeGet:@"" completionHandler:^(NSString* string, BOOl b){
}];

您不应在闭包中使用 !(ImplicitUnwrappedOptional) 关键字。那不允许桥接到 ObjC 代码。只需删除!来自闭包。

func makeGet(place:NSString , completionHandler: (String! , Bool!) -> Void)

func makeGet(place:NSString , completionHandler: (String , Bool) -> Void)

尝试清理并重建以使用所有更改再次生成 "YourModule-Swift.h"。 那么它应该是这样的:

[[DataAPI  new] makeGet:@"" withCompletionHandler:^(NSString* string, BOOl b){
// your code here    
}];

如果您仍然收到该错误,则您的 "YourModule-Swift.h" 文件未正确生成。检查一下!