как получить доступ к массиву с мобильной платформы Kotlin на iOS или Android?
Я пытаюсь создать пузырьковую сортировку в приложении KMM. Теперь KMM func принимает параметр с нативной стороны и передает его со стороны KMM приложения и должен вернуть отсортированный массив обратно в нативную сторону. Теперь у меня мало сомнений.
- Правильно ли я объявляю kotlinArray быстрым? Если я попытаюсь указать его как обычный быстрый массив, он просто не сможет преобразовать его в массив Kotlin и даст мне ошибку приведения. Это то, что я придумал. Итак, это правильный способ связи с KotlinArray из Swift?
-
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
, они будут иметь одинаковое значение. Они оба будут отсортированы.