如何使用Objective-c中的闭包调用Swift方法?

时间:2018-06-06 17:02:13

标签: objective-c swift

我有以下Swift方法:

public func login(userLogin: String, userPassword: String, completion:@escaping (_ result: Result<Data, PZError>) -> ())

我想从Objective-C中调用它,但无法弄清楚闭包部分:

[apiController loginWithUserLogin:userLogin userPassword:password completion:???];

我的完成代码在Objective-C中会是什么样子?

1 个答案:

答案 0 :(得分:1)

不可能直接从Objective-C调用这样的方法。

如果你的结果类型是一个包含非平凡的枚举&#34; case&#34;对象或结构,它不会起作用,因为Objective-C不支持值类型。 Objective-C也不支持Result<T>等通用类型。

修复的一种方法是创建一个包装器,即在Swift中编写第二个适应类型的方法:

func login(userLogin: String, userPassword: String,
    completion: @escaping (_ resultData: Data?, _ resultError: NSError?) -> Void)

在此方法中,您将调用原始登录名,并在内部完成回调中将结果解包为数据和NSError(从PZError转换),并传递调用方的完成块。