如标题所示,我在共享 KMM 模块中定义了接口,我需要在 iOS 端实现它。该界面包含很少的
suspend
功能。然而,当在 Swift 中检查这个接口表示时,每个挂起函数在 Swift 协议中都有 async/await
和 completionHandler
表示。换句话说,我需要实现这两个功能,尽管事实上我只需要一个(在我的情况下,我只希望completionHandler
)。
有没有办法向 KMM 表明我更喜欢其中一个选项,而不是两者兼而有之?
简单的回答是否定的,没有办法。这就是为什么:Kotlin 不具有直接的 Kotlin <-> Swift 互操作性,Kotlin 将代码转换为 Objective-C 并仅生成一种
completionHandler
表示形式。然后 Swift(从 5.5 开始)从 Objective-C 代码生成两种方法 - 一种带有 completionHandler
,另一种带有 async/await
。您可以在官方文档中阅读更多内容。
我还建议您考虑一下您的 KMM API。 Kotlin 接口和 Swift 协议不同,并且仅具有部分互操作性,有时最好在共享模块中提供抽象类而不是接口。
作为解决方法,我建议您查看 Moko-KSwift - 这个 gradle 插件有助于生成 Swift 友好的 API,您可以编写自己的生成器并创建特殊的 Swift 助手。
或者 Skie,一个适用于 Kotlin 多平台的 Swift 友好 API 生成器。