无法将 swift kotlin 接口的实现传递给 kotlin native

Unable to pass swift implementation of kotlin interface to kotlin native

我在 CommonMain

中有一个接口 SampleInterface
interface SampleInterface {
  fun printMessage(message: String)
}

CommonMain

中的单例对象 Singleton
object Singleton {
  private var interfaceObj: SampleInterface? = null
  fun setup(interfaceObj: SampleInterface) {
    this.interfaceObj = interfaceObj
  }

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

我正在尝试在 swift

中实现接口 SampleInterface
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 中,有严格的不变性规则,其中之一规定每个对象都是 mutable XOR shared .为实现这一点,默认情况下,单例 objects 和枚举是 "frozen" - 这意味着每次尝试改变它们都将以 InvalidMutabilityException 结束。为了避免这种情况,必须确保 object 是线程本地的,并且永远不会从另一个线程发生变化。
要了解有关此主题的更多信息,我建议您看一看 Immutability description on the K/N Github, and also the Concurrency 一个。