Невозможно передать быструю реализацию интерфейса kotlin нативному kotlin - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть интерфейс SampleInterface в CommonMain

interface SampleInterface {
  fun printMessage(message: String)
}

и одноэлементный объект Singleton в CommonMain

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

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

Я пытаюсь реализовать интерфейсSampleInterface in swift

class IosImpl: SampleInterface {
  func printMessage(message: String) {
    print("\(message)")
  }
}

передача объекта IosImpl из swift в Singleton in kotlin native

func test() {
  let iImpl = IosImpl()
  Singleton().setup(iImpl) // Failing with KotlinException
}

Исключение:

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

1 Ответ

2 голосов
/ 01 ноября 2019

Проблема здесь заключается в попытке мутировать синглтон Kotlin.
В Kotlin / Native существуют строгие правила неизменности, и одно из них гласит, что каждый объект mutable XOR shared. Чтобы добиться этого, для синглтонов object s и перечислений по умолчанию «заморожены» - это означает, что каждая попытка их изменить будет заканчиваться на InvalidMutabilityException, как вы и получили. Чтобы избежать этого, нужно убедиться, что object является локальным для потока и никогда не будет видоизменяться из другого потока.
Чтобы узнать больше об этой теме, я рекомендую вам ознакомиться с описанием Неизменность на K / N Github, а также Параллелизмом one.

...