Проблема взаимодействия Kotlin-Swift: ArrayList имеет неправильное значение счетчика при передаче в качестве NSMutableArray из сборок Swift Code for Release

Предположим, что в проекте KMP установлено приложение Sample iOS, в котором в качестве зависимости добавлена ​​структура вывода модуля KMP.

У меня есть функция sampleFuncForStringArrayList(names: ArrayList<String>) в модуле KMP, которая печатает количество, повторяет и печатает элементы ArrayList.

Когда я вызываю эту функцию из примера приложения iOS, я получаю исключение index out ofbound, потому что NSMutableArray count, который равен 2 в среде приложения iOS, имеет count как 24576 при получении как ArrayList в KMP. модуль.

Эта проблема возникает только с ReleaseFramework. debugFramework работает нормально.

//Swift
let namesStringList = NSMutableArray(array: ["Alice", "Bob"])
print("NSMutableArray COUNT : \(namesStringList.count)")
Main().sampleFuncForStringArrayList(names: namesStringList)


//Kotlin
public class Main {
    public fun sampleFuncForStringArrayList(names: ArrayList<String>){
        println("names.isNullOrEmpty() ${names.isNullOrEmpty()}")
        println("names.count ${names.count()}")
        names.forEach {
            println("Hello $it")
        }
    }
}

Ожидаемый результат

NSMutableArray COUNT : 2
names.isNullOrEmpty() false
names.count 2
Hello Alice
Hello Bob

Фактический результат:

NSMutableArray COUNT : 2
names.isNullOrEmpty() false
names.count 24576
CRASH

– АВАРИЙНОЕ ЗАВЕРШЕНИЕ –

ZIP-файл примера проекта: https://drive.google.com/file/d/1SgmW4hfeWaEeD3vcidnZ81Q9vMJsU9zJ/view?usp=sharing


person Alex    schedule 10.09.2020    source источник
comment
похоже на чистую ошибку KMP   -  person Kiril S.    schedule 10.09.2020
comment
Будет ли он падать, если вместо String будет какой-то другой [примитивный] тип?   -  person user28434'mstep    schedule 10.09.2020
comment
Да. Я пробовал с Int и простым перечислением. У обоих был одинаковый результат.   -  person Alex    schedule 10.09.2020
comment
Какую версию котлина вы используете?   -  person shadowsheep    schedule 11.09.2020
comment
Не тестировал ваш проект, но с моей настройкой KMM и kotlin 1.4.10, даже если я использовал MutableList, а не ArrayList ref, я знаю ваше ожидаемое поведение в обоих моих случаях.   -  person shadowsheep    schedule 11.09.2020
comment
Котлин 1.4.10. У меня такой же сбой и для 1.4.0.   -  person Alex    schedule 11.09.2020
comment
Обновление: проблема возникает только с ReleaseFramework. Возможно, вы пытаетесь использовать debugFramework.   -  person Alex    schedule 11.09.2020
comment
Я тестировал только в режиме отладки, да.   -  person shadowsheep    schedule 11.09.2020
comment
@JolasJoe У меня не возникнет проблем, если я использую MutableList даже с фреймворком выпуска. С отладочной структурой я получил count = 0, но не сбой. Вы пытались использовать MutableList как правильный тип для взаимодействия kotlin/swift? fun sampleFuncForStringMutableList(names: MutableList<String>)   -  person shadowsheep    schedule 11.09.2020


Ответы (1)


Я пробовал с моей настройкой KMM (используяcoapods), и даже с выпускной сборкой я получил правильное ожидаемое поведение, но я использовал правильное сопоставление взаимодействия kotlin/swift type MutableList

fun sampleFuncForStringMutableList(names: MutableList<String>) {
    println("names.isNullOrEmpty() ${names.isNullOrEmpty()}")
    println("names.count ${names.count()}")
    names.forEach {
        println("Hello $it")
    }
}

С ArrayList я вижу пустой массив, а затем сбой (в отличие от сборки отладки, где я также вижу ваше ожидаемое поведение).

let namesStringList = NSMutableArray(array: ["Alice", "Bob"])
print("NSMutableArray COUNT : \(namesStringList.count)")
Main().sampleFuncForStringArrayList(names: namesStringList)
Main().sampleFuncForStringMutableList(names: namesStringList)
NSMutableArray COUNT : 2
names.isNullOrEmpty() true
names.count 0
names.isNullOrEmpty() false
names.count 2
Hello Alice
Hello Bob

Поэтому я предлагаю вам использовать правильный тип отображения, а не другой.

person shadowsheep    schedule 11.09.2020