как получить доступ к массиву с мобильной платформы Kotlin на iOS или Android?

Я пытаюсь создать пузырьковую сортировку в приложении KMM. Теперь KMM func принимает параметр с нативной стороны и передает его со стороны KMM приложения и должен вернуть отсортированный массив обратно в нативную сторону. Теперь у меня мало сомнений.

  1. Правильно ли я объявляю kotlinArray быстрым? Если я попытаюсь указать его как обычный быстрый массив, он просто не сможет преобразовать его в массив Kotlin и даст мне ошибку приведения. Это то, что я придумал. Итак, это правильный способ связи с KotlinArray из Swift?
  2. fun bubbleSortотлично работает, когда я пытаюсь запустить его в собственном проекте. Но когда я пытаюсь запустить проект KMM, он просто возвращает мне мусор. Так может ли кто-нибудь помочь мне понять, как этого можно достичь?

Ниже мой исходный код.

      SourceCode for ContentView.swift:

func greet() -> String {
    
    let array = KotlinIntArray(size: 5)
    array.set(index: 0, value: 2)
    array.set(index: 1, value: 15)
    array.set(index: 2, value: 1)
    array.set(index: 3, value: 8)
    array.set(index: 4, value: 4)
    let sortedArray = Greeting().bubbleSort(arr:array)

    print("Entered Array :\(array)"). //output: Entered Array :kotlin.IntArray@187bd58

    print("Sorted Array :\(sortedArray)") //Output: Sorted Array :kotlin.IntArray@187bd58
    
    return Greeting().greeting()
    
}
      SourceCode for Greetings.kt:
package com.example.kmm_perofomance.shared


class Greeting {
    fun greeting(): String {
        return "Hello, ${Platform().platform}!"
    }

     fun bubbleSort(arr:IntArray):IntArray{
         for (i in 1..arr.count()) {
           for (j in 1..arr.count() - i) {
               if( arr[j] < arr[j-1]) {
                   var temp = arr[j-1]
                   arr[j-1] = arr[j]
                   arr[j] = temp
               }
           }
       }
        return arr
    }
}

Выходной снимок экрана:

Любая помощь приветствуется.

2 ответа

Я бы посоветовал вам использовать, а не использовать KotlinIntArray. Письмо ArrayList<Int> по умолчанию преобразует его в NSMutableArray в swift.

Пример :-

Вам необходимо иметь это в вашем общем модуле:-

      fun sortArray(array: ArrayList<Int>) : ArrayList<Int> {
    // Your Swap logic here
    return array
}

Тогда в вашем быстром коде вы можете иметь это:-

      let array = NSMutableArray()
    array.add(2)
    array.add(5)
    array.add(1)
    array.add(7)
    print("\(Greeting().sortArray(array: array))")

Ваш результат будет таким:-

      (2, 5, 1, 7)

Из этого вам не нужно будет писать отдельную функцию для получения элемента массива один за другим.

«Мусорное значение» - это значение по умолчанию toString для этого типа или, возможно, тип оболочки для массива. В любом случае там написано «kotlin.IntArray», который является типом, и «@_____», который является значением идентификатора или указателя (не уверен). В любом случае, очевидно, что это не список ценностей. Чтобы распечатать это, вы должны написать функцию, которая печатает это для вас.

KMM конвертирует массивы List и Swift туда и обратно. Массивы Kotlin не преобразуются и представляют собой простые типы объектов, с которыми может взаимодействовать Swift, поэтому приведенный выше пример кажется прекрасным. Просто ты не правильно распечатываешь.

Однако я понятия не имею, верен ли ваш код сортировки.

Я хотел бы отметить, что вы изменяете передаваемый массив и возвращаете его, что приведет к неверному результату. В момент печати array и sortedArray, они будут иметь одинаковое значение. Они оба будут отсортированы.

Другие вопросы по тегам