kotlin - 从 kotlin/native 框架调用 swift 中的类

标签 kotlin

我按照教程进行操作:https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html并成功导出 Android 的 jar 文件和 iOS 的框架。当我想实现更复杂的东西之后。我使用 Android Studio Kotlin 并使用以下代码:

模型.kt:

package org.kotlin.mpp.mobile.BusinessLogic

abstract class Model{

var _id:Long = 0

abstract fun PolymorphismTest()
}

销售.kt:

package org.kotlin.mpp.mobile.BusinessLogic

class Sales : Model() {

init {
    this._id = _counter
    _counter++

}
companion object {

    private var _counter: Long = 0

}

fun get_counter(): Long {
    return _counter
}

private val _salesItems:MutableList<SalesItem> = ArrayList()

fun SalesItems(): MutableList<SalesItem> {
    return _salesItems
}

fun TotalAmount():Double
{
    var totalAmount:Double = 0.0
    for(aSalesItem in _salesItems)
    {
        totalAmount += aSalesItem.SubTotal()
    }

    return totalAmount
}

fun AddSalesItem(salesItem: SalesItem)
{
    this._salesItems.add(salesItem)
}

fun AddSalesItem(itemName:String, itemCode:String, quantity:Double, amount:Double )
{
    val aSalesItem = SalesItem()
    aSalesItem._itemCode = itemCode
    aSalesItem._itemName = itemName
    aSalesItem._quantity = quantity
    aSalesItem._amount = amount
    this.AddSalesItem(aSalesItem)
}

fun ToString(): String {
    return "Sales: $this._id"
}


override fun PolymorphismTest() {
    println("This is method from Sales")
}

}

销售项目.kt:

package org.kotlin.mpp.mobile.BusinessLogic

class SalesItem : Model() {

init {
    this._id = _counter
    _counter++
}
companion object {

    private var _counter: Long = 0
}

fun get_counter(): Long {
    return _counter
}

var _sales: Sales? = null

var _amount:Double = 0.toDouble()
var _quantity:Double = 0.toDouble()

fun SubTotal(): Double {
    return _amount * _quantity
}

var _itemName:String? = null
var _itemCode:String? = null


fun Sales():Sales?{
    return _sales
}

fun SalesItem(sales:Sales)
{
    _sales = sales
    this._id = _counter
    _counter++
}

fun ToString(): String {
    return "Sales: $this._id"
}

override fun PolymorphismTest() {
    println("This is method from SalesItem")
}
}

我将这些代码导出到框架中,然后导入到 Xcode 中并使用 Swift 进行调用

ViewController.swift

import UIKit
import SharedCode
class ViewController: UIViewController{

override func viewDidLoad(){
     super.viewDidLoad()

     print("Creating Sales Object")
     let sales = Sales() //error here

   }
 }

之后我遇到了错误

Instances of kotlin.Error, kotlin.RuntimeException and subclasses aren't propagated from Kotlin to Objective-C/Swift. Other exceptions can be propagated as NSError if method has or inherits @Throws annotation. Uncaught Kotlin exception: kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen org.kotlin.mpp.mobile.BusinessLogic.Sales.Companion@228b588 at 0 SharedCode

最佳答案

Kotlin/Native 有不同的线程模型。这个想法是,必须卡住对象的实例才能从所有线程访问。有 .freeze() 扩展方法。

默认情况下,object Smth 也会被卡住。在代码狙击手中,伴生对象中有可变字段。

一种可能的解决方法是将伴生对象替换为您显式创建的普通类

https://kotlinlang.org/docs/reference/native/concurrency.html#concurrency-in-kotlinnative

https://kotlinlang.org/docs/reference/native/immutability.html#immutability-in-kotlinnative

关于kotlin - 从 kotlin/native 框架调用 swift 中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55136106/

相关文章:

android - 创建垂直分隔线 Jetpack Compose

java - void 函数/属性调用在哪里执行?

android - 房间 : Crash on emulator

使用 @Query hibernate jpa 投影

lambda - Kotlin:为什么函数不能存储在变量中?

kotlin - 我如何在其中传递 onClick 参数?

android - 空 queryProductDetailsAsync 问题

gradle - Gradle 项目中的 .kts 脚本

Kotlin:如何将序列(协程)作为 Iterable<T> 传递

java - 如何将InputStream转换为FilePart?