正如标题所示,我已经在共享KMM模块中定义了接口,需要在iOS端实现。该接口包含很少的suspend函数。但是,当在Swift中检查该接口表示时,每个suspend函数在Swift协议中同时具有async/await和completionHandler表示。换句话说,我被要求实现这两个函数,尽管事实上我只需要一个(在我的情况下,我宁愿只实现completionHandler)。是否有办法向KMM表明我更喜欢一个选项而不是两个都有?
suspend
async/await
completionHandler
ktca8awb1#
答案很简单,不可能。这就是为什么:Kotlin没有直接的Kotlin<->Swift互操作性,Kotlin将代码翻译成Objective-C并只生成一个completionHandler表示。然后Swift(从5.5开始)从Objective-C代码生成两个方法-一个使用completionHandler,另一个使用async/await。你可以在official documentation中阅读更多内容。我还建议你考虑一下你的KMM API。Kotlin接口和Swift协议是不同的,只有部分的互操作性,有时候在你的共享模块中提供抽象类而不是接口会更好。作为解决方案,我建议您查看Moko-KSwift-此gradle插件有助于生成Swift友好的API,您可以编写自己的生成器并创建特殊的Swift助手。
1条答案
按热度按时间ktca8awb1#
答案很简单,不可能。这就是为什么:Kotlin没有直接的Kotlin<->Swift互操作性,Kotlin将代码翻译成Objective-C并只生成一个
completionHandler
表示。然后Swift(从5.5开始)从Objective-C代码生成两个方法-一个使用completionHandler
,另一个使用async/await
。你可以在official documentation中阅读更多内容。我还建议你考虑一下你的KMM API。Kotlin接口和Swift协议是不同的,只有部分的互操作性,有时候在你的共享模块中提供抽象类而不是接口会更好。
作为解决方案,我建议您查看Moko-KSwift-此gradle插件有助于生成Swift友好的API,您可以编写自己的生成器并创建特殊的Swift助手。