Невозможно сослаться на пакет kotlinx.cinterop в проекте Kotlin Multiplatform

Я создал проект Kotlin Multiplatform на основе примера для iOS и Android ( https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html). В моей цели iOS я использую cinterop для связи в сторонней платформе Objective-C. Это работает нормально. Я могу ссылаться на классы фреймворка в своем коде Kotlin в исходном наборе 'iosMain'. Однако для одного из вызовов метода требуется параметр NSError**. Я пытаюсь использовать следующее для создания этой переменной в моем коде Kotlin:

kotlinx.cinterop.NativePlacement.allocPointerTo<kotlinx.cinterop.ObjCObjectVar<platform.Foundation.NSError?>()

Я не смог найти вокруг следующих ошибок:

> Task :sharedLib:linkMainDebugFrameworkIOS FAILED
src/iosMain/kotlin/Platform.kt:9:50: error: unresolved reference: allocPointerTo
    val error = kotlinx.cinterop.NativePlacement.allocPointerTo<kotlinx.cinterop.ObjCObjectVar<platform.Foundation.NSError?>()
                                                 ^
src/iosMain/kotlin/Platform.kt:9:126: error: no value passed for parameter 'rawPtr'
    val error = kotlinx.cinterop.NativePlacement.allocPointerTo<kotlinx.cinterop.ObjCObjectVar<platform.Foundation.NSError?>()

Насколько я понимаю, этот пакет является частью stdlib, который должен добавляться как зависимость автоматически. Я где-то пропустил часть уравнения?

ОБНОВИТЬ

Ниже приведен пример передачи ссылки NSError * от Kotlin:

memScoped {
    val errorRef = alloc<ObjCObjectVar<NSError?>>()
    someObjCObject.method(errorRef.ptr)
}

1 ответ

Решение

kotlinx.cinterop.NativePlacement это имя интерфейса, а не имя класса. Вам нужен экземпляр NativePlacement интерфейс для работы. Например memscoped{..} блок будет работать, например

import kotlinx.cinterop.*
import platform.Foundation.*

val p = memScoped {    
  allocPointerTo<ObjCObjectVar<NSError?>>()
}

memscoped{..} принимает лямбда, внутри лямбда получатель реализует NativePlacement тип, поэтому нет необходимости для спецификатора для вызова функции на нем

https://kotlinlang.org/docs/reference/lambdas.html

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