从Swift访问Kotlin标准库

5
在我的 Kotlin 多平台项目中,我想从 Swift 中访问在 kotlin-stdlib 中定义的 Kotlin 类型。

TL;DR: 看起来 StdLib 的类型/方法没有生成头文件定义,我希望有一种不需要编写大量样板代码的解决方案。

我的情况

我在 Kotlin 中定义了一个接口...

interface MyKotlinInterface {
  fun run() : Sequence<String>
}

...并在Swift中实现了这个接口...

class MySwiftClass : MyKotlinInterface {
  func run() -> KotlinSequence {
    // return sequenceOf("foo")
  }
}

我正在尝试创建一个 Sequence,但是没有来自 kotlin.sequences 包的方法可用(例如 generateSequence)。

实际上是否可以访问 Kotlin 框架类型或方法超出我在代码中定义的范围--如果可以,如何做到?此外,如何在不编写样板代码的情况下实现这一点?

更多细节

查看生成的 Objective-C 头文件,我看到了我的类(显然)和基本的 Kotlin 类型的定义。缺少的基本上是标准库功能的所有内容(我关心所有与 Sequence 相关的内容)。

我的 build.gradle.kts 如下:

plugins {
  kotlin("multiplatform") version "1.3.0"
}

kotlin {
    targets { /* ... */ }

    sourceSets {

        getByName("commonMain") {
            dependencies {
                api("org.jetbrains.kotlin:kotlin-stdlib-common")
            }
        }

        // ...

        getByName("iosMain") {
            dependencies {
                api("org.jetbrains.kotlin:kotlin-stdlib")
            }
        }
    }
}

拥有kotlin-stdlib作为iOS目标的依赖项,我希望这些函数可以在Swift中实际使用。

最小工作示例

https://github.com/panzerfahrer/so-mwe-kotlin-mpp-swift

当前解决方案

我能想到的唯一解决方案是,为iOS目标编写所需的函数:

fun <T : kotlin.Any> generateSequence(nextFunction: () -> T?): kotlin.sequences.Sequence<T> = kotlin.sequences.generateSequence(nextFunction)

这种方法可以“勉强可行”,但过于繁琐。此外,使用这种方法无法提供扩展函数,需要更多的样板代码甚至需要重写部分标准库。
期望解决方案:我希望尽可能避免编写样板代码。实际上,我只在意(在我的情况下)完全可以从Swift中访问Sequence。我的想法是,编译器生成选定或所有标准库功能的头定义就足够了。

同时,我发现了一个相关的 Github 问题,基本上涵盖了这种情况。 - Brian
你的 Kotlin 代码真的需要惰性计算(又称序列)吗?如果不需要,我建议使用 List<T> 替代它(这与 Swift 相对应)。 对于序列实现,一个解决方法是从你的 Kotlin 库中导出一个工厂函数来帮助在 Swift 端构建序列。 - Eugene Petrenko
1个回答

1

你的Kotlin代码真的需要懒计算(又称序列)吗?如果不需要,我建议使用List<T>代替(它可以直接映射到Swift)。

对于Sequence实现,一个解决方法是从你的Kotlin库中导出一个工厂函数,例如,你可以声明一个函数:

fun <T : kotlin.Any> generateSequence(nextFunction: () -> T?)
    = kotlin.sequences.generateSequence(nextFunction)

你可以选择任何适合你使用场景的Sequence工厂函数。
通常情况下,Kotlin标准库中的函数太多了。将它们全部导出到Swift中会在二进制文件中创建太多无用的符号,并增加编译时间。

那是我的目前解决方案(请参见问题的下半部分):-P - Brian
是的,也许使用List<T>而不是Sequence更有意义。你的示例代码库没有因为使用Sequence<T>而获得好处。 - Eugene Petrenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接