Kotlin Multiplatform: совместная реализация реальных классов для нескольких целей (iOS, macOS) - PullRequest
1 голос
/ 25 июня 2019

Я работаю над проектом Kotlin / Native Multiplatform, который поддерживает JVM, iOS и macOS.В моей настройке есть следующие модули:

- common
- ios
- jvm
- macos

Я хочу использовать некоторый нативный код в качестве класса actual и поместить класс expected в common.Однако фактическая реализация класса идентична для нескольких целей (iOS и macOS).Есть ли способ, которым я могу настроить свои источники (возможно, в Gradle), чтобы мне не приходилось хранить 2 идентичные копии фактического класса?

Ответы [ 3 ]

3 голосов
/ 26 июня 2019

Статей имеет довольно сложный конфиг.iOS и Macos используют один и тот же код.

Для структурирования проекта существует commonMain, nativeCommonMain, зависящее от этого, и фактически appleMain, которое зависит от nativeCommonMain.

* 1008.*

Эта структура, вероятно, глубже, чем вам нужно, но нам нужно было что-то для linux и windows, которое было бы другим.Мне кажется, что за ответом Егора легче следовать.

На самом деле мы определяем многоплатформенную атомику в Stately, поэтому вы можете использовать их как источник вдохновения или просто использовать саму библиотеку.

https://github.com/touchlab/Stately

Общий

expect class AtomicInt(initialValue: Int) {
  fun get(): Int
  fun set(newValue: Int)
  fun incrementAndGet(): Int
  fun decrementAndGet(): Int

  fun addAndGet(delta: Int): Int
  fun compareAndSet(expected: Int, new: Int): Boolean
}

JVM

actual typealias AtomicInt = AtomicInteger

Родной

actual class AtomicInt actual constructor(initialValue:Int){
  private val atom = AtomicInt(initialValue)

  actual fun get(): Int = atom.value

  actual fun set(newValue: Int) {
    atom.value = newValue
  }

  actual fun incrementAndGet(): Int = atom.addAndGet(1)

  actual fun decrementAndGet(): Int = atom.addAndGet(-1)

  actual fun addAndGet(delta: Int): Int = atom.addAndGet(delta)

  actual fun compareAndSet(expected: Int, new: Int): Boolean = atom.compareAndSet(expected, new)

}
2 голосов
/ 26 июня 2019

В Okio мы объявляем два дополнительных набора источников, nativeMain и nativeTest, и настраиваем встроенные собственные наборы источников в зависимости от них:

apply plugin: 'org.jetbrains.kotlin.multiplatform'

kotlin {
  iosX64()
  iosArm64()
  linuxX64()
  macosX64()
  mingwX64('winX64')
  sourceSets {
    nativeMain {
      dependsOn commonMain
    }
    nativeTest {
      dependsOn commonTest
    }

    configure([iosX64Main, iosArm64Main, linuxX64Main, macosX64Main, winX64Main]) {
      dependsOn nativeMain
    }
    configure([iosX64Test, iosArm64Test, linuxX64Test, macosX64Test, winX64Test]) {
      dependsOn nativeTest
    }
  }
}
0 голосов
/ 25 июня 2019

Если все три реализации идентичны, просто поместите этот код в common.expect/actual используется только для вещей, которые отличаются на разных платформах

...