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

Posted

技术标签:

【中文标题】在目标 c 中调用 Swift 完成处理程序【英文标题】:Call Swift completion handler in objective c 【发布时间】:2016-08-17 09:54:07 【问题描述】:

我正在尝试调用一个 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 中不工作吗:( 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

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

试试:

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

【讨论】:

该代码不起作用 Andrey,但感谢您指出问题。 +1【参考方案3】:

你不应该在闭包中使用 !(ImplicitUnwrappedOptional) 关键字。这不允许桥接到 ObjC 代码。只需删除!从关闭。

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

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

【讨论】:

以上是关于在目标 c 中调用 Swift 完成处理程序的主要内容,如果未能解决你的问题,请参考以下文章

从 Java Script (TVML) 调用带有完成处理程序的 Swift 函数

使用完成处理程序在 Swift 中调用连续动画

完成处理程序没有被调用为假定的 Swift

从 Timer 选择器函数 Swift 调用函数的完成处理程序

Swift 3,未调用 URLSession 数据任务完成处理程序

如何在 Swift 中创建一个我可以选择调用的完成处理程序?