Creé un proyecto multiplataforma de Kotlin basado en el ejemplo para iOS y Android ( https://kotlinlang.org/docs/tutorials/native/mpp-ios-android.html ). Dentro de mi objetivo de iOS, estoy usando cinterop para vincular en un marco Objective-C de terceros. Esto está funcionando bien. Puedo hacer referencia a las clases del marco en mi código Kotlin dentro del conjunto de fuentes 'iosMain'. Sin embargo, una de las llamadas a métodos requiere un parámetro NSError**. Estoy intentando usar lo siguiente para crear esta variable en mi código Kotlin:
kotlinx.cinterop.NativePlacement.allocPointerTo<kotlinx.cinterop.ObjCObjectVar<platform.Foundation.NSError?>()No he podido solucionar los siguientes errores:
> 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?>()Tengo entendido que este paquete es parte de stdlib, que debe agregarse como una dependencia automáticamente. ¿Me estoy perdiendo una parte de la ecuación en alguna parte?
ACTUALIZAR
El siguiente es un ejemplo de pasar una referencia NSError* de Kotlin:
memScoped { val errorRef = alloc<ObjCObjectVar<NSError?>>() someObjCObject.method(errorRef.ptr) }kotlinx.cinterop.NativePlacement es un nombre de interfaz, no un nombre de clase. Necesita una instancia de la interfaz NativePlacement para funcionar. Por ejemplo memscoped{..} funcionará, por ejemplo
import kotlinx.cinterop.* import platform.Foundation.* val p = memScoped { allocPointerTo<ObjCObjectVar<NSError?>>() } El memscoped{..} acepta una lambda, dentro de la lambda el receptor implementa el tipo NativePlacement , por lo que no es necesario que un calificador llame a una función en él
https://kotlinlang.org/docs/reference/lambdas.html#function-literals-with-receiver