原生iOS项目中的Kotlin文件与Kotlin / Native

我想包含一个Kotlin文件,它只在现有的iOS项目中执行数据处理和网络操作,同时保留原生的iOS UI代码。

虽然我认为这可以通过Kotlin / Native实现,但我发现使用Kotlin / Native的iOS示例( 1,2 )似乎也接管了iOS UI代码。

是否包含一个Kotlin文件,用于在iOS中使用Kotlin / Native进行数据传输,而不需要触摸UI代码,如果是这样,那么步骤如何?

是的,在跨平台项目中可以使用Kotlin / Native在Kotlin和本机iOS UI代码之间传输数据。 这允许基于Kotlin的数据模型具有通用的代码库,同时例如继续使用iOS的本地UI代码。

原始certificate:

项目https://github.com/justMaku/Kotlin-Native-with-Swift指出我正确的方向,因为它显示了这样做的基本步骤:

在Swift UIViewController中,它调用一个包装函数,它将接收来自Kotlin函数的字符串。 调用是通过一个C ++层调用的,C ++层本身启动Kotlin运行时,将请求传递给Kotlin函数,从中接收字符串,并将其传回给Swift UIViewController,然后显示它。

在技​​术层面上,该项目包含一个将Kotlin,C ++和Kotlin / Native部分编译成静态库的脚本,然后可以从本地iOS项目调用该脚本。

为了让代码运行,在运行“./setup.sh”之前,我已经(从git克隆之后)执行“git submodule sync”。

要使用基于Kotlin的数据模型传输数据,我希望有一个通用函数,可以将数据传递给Kotlin,修改数据并将结果返回到本机iOS代码。 作为一个原则的certificate,可以建立这样一个function,我把这个项目扩展到不仅从Kotlin接收一个字符串,而且发送一个给Kotlin,追加它,并把结果发送回去。

项目延期:

由于在这个看起来很简单的扩展中有一些障碍,我为任何感兴趣的人制定了步骤。 如果你遵循,你应该得到以下显示:

Kotlin < -/> Swift”> </p>
<p> 文本可能是愚蠢的,但它告诉你,会发生什么。 函数viewDidAppear中的ViewController.swift中的更改是: </p>
<pre><code>let swiftMessage: String =

你会看到Swift在包装函数中发送给Kotlin的文本(最后,将显示结果’string’variables)。 可以直接将Swift字符串传递给包装器,但我想强调一下,包装器会将输入和输出视为c字符串。 事实上,原生iOS项目中的文件Kotlin Native-Bridging-Header.h现在变成:

 extern const char* kotlin_wrapper(const char* swiftMessage); 

在它上到文件Launcher.cpp。 由于原始文件使用KString作为kotlin_main的结果值,所以我尝试了一段时间将const char *转换为KString并将其传递给kotlin_main。 最后我发现,将const char *variables直接传送给Kotlin要简单得多,并且用Kotlin / Native给我们的函数进行转换。

我的Launcher.cpp然后变得比原来更紧凑。 这里是完整的文件:

 #include "Memory.h" #include "Natives.h" #include "Runtime.h" #include "KString.h" #include  #include  extern "C" const char* kotlin_main(const char* swiftMessageChar); extern "C" const char* kotlin_wrapper(const char* swiftMessageChar) { RuntimeState* state = InitRuntime(); if (state == nullptr) { return "Failed to initialize the kotlin runtime"; } const char* exitMessage = kotlin_main(swiftMessageChar); DeinitRuntime(state); return exitMessage; } 

您将看到包装器如何首先启动Kotlin运行时,然后调用驻留在文件kotlin.kt中的函数kotlin_main:

 import konan.internal.ExportForCppRuntime import kotlinx.cinterop.CPointer import kotlinx.cinterop.ByteVar import kotlinx.cinterop.cstr import kotlinx.cinterop.nativeHeap import kotlinx.cinterop.toKString @ExportForCppRuntime fun kotlin_main(cPtr: CPointer): CPointer { val swiftMessage = cPtr.toKString() val kotlinMessage = "Hello Swift, I got your message: '$swiftMessage'." val returnPtr = kotlinMessage.cstr.getPointer(nativeHeap) return returnPtr } 

该指针被转换为Kotlin字符串,然后用于创建kotlinMessage(数据转换的示例)。 结果消息然后被转换回一个指针,并通过包装返回到Swift UIViewController。

然后去哪儿?

原则上,可以使用这个框架,而不用再次触摸C ++层。 只需定义pack和unpack函数,将任意数据types打包到一个字符串中,并将字符串解压到另一端的相应数据types。 这样的打包和解包function必须每种语言只写一次,如果做得足够通用,可以重用于不同的项目。 在实践中,我可能会首先重写上面的代码来传递二进制数据,然后编写pack和unpack函数来将任意数据types转换为二进制数据和从二进制数据转换。