Ios 无法将kotlin接口的swift实现传递给kotlin本机

Ios 无法将kotlin接口的swift实现传递给kotlin本机,ios,swift,kotlin,kotlin-multiplatform,kotlin-native,Ios,Swift,Kotlin,Kotlin Multiplatform,Kotlin Native,我在CommonMain interface SampleInterface { fun printMessage(message: String) } object Singleton { private var interfaceObj: SampleInterface? = null fun setup(interfaceObj: SampleInterface) { this.interfaceObj = interfaceObj } fun printM

我在
CommonMain

interface SampleInterface {
  fun printMessage(message: String)
}
object Singleton {
  private var interfaceObj: SampleInterface? = null
  fun setup(interfaceObj: SampleInterface) {
    this.interfaceObj = interfaceObj
  }

  fun printMessage(message: String) {
    this.interfaceObj?.printMessage(message)
  }
}
以及
CommonMain

interface SampleInterface {
  fun printMessage(message: String)
}
object Singleton {
  private var interfaceObj: SampleInterface? = null
  fun setup(interfaceObj: SampleInterface) {
    this.interfaceObj = interfaceObj
  }

  fun printMessage(message: String) {
    this.interfaceObj?.printMessage(message)
  }
}
我正在尝试在
swift

class IosImpl: SampleInterface {
  func printMessage(message: String) {
    print("\(message)")
  }
}
IosImpl
对象从
swift
传递到
kotlin native中的
Singleton

func test() {
  let iImpl = IosImpl()
  Singleton().setup(iImpl) // Failing with KotlinException
}
例外情况:

Uncaught Kotlin exception: kotlin.native.concurrent.InvalidMutabilityException: mutation attempt of frozen 

这里的问题是试图变异Kotlin的单例的结果。
在Kotlin/Native中,有严格的不变性规则,其中一条规定每个对象都是
可变异或共享的
。要实现这一点,对于单例
对象
s和枚举,默认情况下是“冻结”的-这意味着每次尝试对它们进行变异都将以
InvalidMutabilityException
结束。为了避免这种情况,必须确保
对象
是线程本地的,并且永远不会从另一个线程变异
要阅读更多关于这个主题的内容,我建议您查看关于K/N Github的描述,以及其中的一个。

这里的问题是试图改变Kotlin的单例的结果。
在Kotlin/Native中,有严格的不变性规则,其中一个规则声明每个对象都是
可变异或共享的。要实现这一点,对于单例
对象
s和枚举,默认情况下是“冻结”的-这意味着每次尝试对它们进行变异都将以
InvalidMutabilityException
结束。为了避免这种情况,必须确保
对象
是线程本地的,并且永远不会从另一个线程变异
要阅读更多关于此主题的内容,我建议您查看K/N Github上的描述,以及其中的一个。

嘿,Artyom,有没有一种方法可以在不使共享singleton的属性成为线程本地的情况下对其进行变异?我认为这不是一种选择,因为语言限制。也许你可以通过使用
AtomicReference
找到一些有用的东西,这当然取决于这段代码的目的。嘿,Artyom,有没有一种方法可以在不使共享单例的属性成为线程本地的情况下对其进行变异?我认为这不是一种选择,因为语言的限制。也许人们可以通过使用原子引用来发现一些有用的东西,这当然取决于此代码的用途。