Kotlin 多平台接口挂起函数在 Swift 协议中表示为异步等待和完成处理程序

问题描述 投票:0回答:1

如标题所示,我在共享 KMM 模块中定义了接口,我需要在 iOS 端实现它。该界面包含很少的

suspend
功能。然而,当在 Swift 中检查这个接口表示时,每个挂起函数在 Swift 协议中都有
async/await
completionHandler
表示。换句话说,我需要实现这两个功能,尽管事实上我只需要一个(在我的情况下,我只希望
completionHandler
)。

有没有办法向 KMM 表明我更喜欢其中一个选项,而不是两者兼而有之?

swift async-await interface kotlin-multiplatform suspend
1个回答
3
投票

简单的回答是否定的,没有办法。这就是为什么: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 生成器。

© www.soinside.com 2019 - 2024. All rights reserved.