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