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