Kotlin Multiplatform: совместная реализация реальных классов для нескольких целей (iOS, macOS)

Чтобы исключить исключительное исключение индекса массива, следует использовать инструкцию расширенный- for , где и когда они могут.

Основная мотивация (и использовать), когда вы выполняете итерацию, и вам не требуются сложные шаги итерации. Вы не могли бы использовать расширенный for для перемещения назад в массиве или только для итерации на каждом другом элементе.

Вы гарантированно не исчерпали элементы для повторения при этом, а ваш [исправленный] пример легко конвертируется.

Код ниже:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i< name.length; i++) {
    System.out.print(name[i] + "\n");
}

... эквивалентен этому:

String[] name = {"tom", "dick", "harry"};
for(String firstName : name) {
    System.out.println(firstName + "\n");
}

1
задан sschilli 25 June 2019 в 21:26
поделиться

3 ответа

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

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

commonMain {
    dependencies {
        implementation 'org.jetbrains.kotlin:kotlin-stdlib-common'
    }
}

jvmMain {
    dependsOn commonMain
    dependencies {
        implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
    }
}

nativeCommonMain {
    dependsOn commonMain
}

appleMain {
    dependsOn nativeCommonMain
}

configure([iosX64Main, iosArm64Main, macosMain, iosArm32Main]) {
    dependsOn appleMain
}

, Что структура, вероятно, глубже, чем Вы, нуждаются, но нам было нужно что-то для Linux и окон, который отличался. Ответу Egor выше легче следовать, я думаю.

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

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)

}
3
ответ дан Kevin Galligan 25 June 2019 в 21:26
поделиться

В 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
    }
  }
}
2
ответ дан Egor 25 June 2019 в 21:26
поделиться

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

0
ответ дан Carson Graham 25 June 2019 в 21:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: