在目标 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
中,完成处理程序有两个参数:String
和Bool
,而在您的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 函数
从 Timer 选择器函数 Swift 调用函数的完成处理程序