在Objective-C中调用Swift的完成处理程序

5
我将为您翻译以下关于IT技术的文本,内容如下:

我正在尝试调用一个实现如下的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类中调用它,但是它抛出了一个错误"No Visible interface for DataAPI declares selector makeGet:completionHandler"

这是我在Objective C类中调用该方法的方式:

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

你能帮忙吗?在Swift 5中它不起作用 :( - Tiger
3个回答

3
尝试进行清理和重新构建,以便再次生成“YourModule-Swift.h”并将所有更改包含在内。然后应该像这样:
[[DataAPI  new] makeGet:@"" withCompletionHandler:^(NSString* string, BOOl b){
// your code here    
}];

如果你仍然遇到这个错误,那么你的 "YourModule-Swift.h" 文件没有被正确生成。请检查一下!

3

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

请尝试:

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

那段代码不起作用,Andrey,但感谢你指出了这个问题。+1 - Vizllx

2

在闭包中不应该使用 !(ImplicitUnwrappedOptional) 关键字。这会禁止桥接到 ObjC 代码。只需从闭包中删除 ! 即可。

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

to

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接