Чтобы исключить исключительное исключение индекса массива, следует использовать инструкцию расширенный- 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");
}
Величественный имеет справедливо включенную конфигурацию. 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
}
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)
}
В 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
}
}
}
Если все три реализации идентичны, просто поместите этот код в common
. expect/actual
используется только для вещей, которые различны на разных платформах