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