Ios 如何在KMM(kotlin native)共享模块中读取Swift框架库中生成的对象数组
我正在开发KMM应用程序。共享模块有一个helper类,它依赖于android部分和iOS部分的不同本机库。这是通过已知的“预期/实际”模式实现的 如上所述,iOS实际类使用iOS框架,该框架执行一些计算,并返回一个对象数组。创建对象列表的ios框架工作正常(它通过单元测试进行了测试)。下面是一个简化的例子 这是数组内部的对象类:Ios 如何在KMM(kotlin native)共享模块中读取Swift框架库中生成的对象数组,ios,swift,kotlin,kotlin-multiplatform,Ios,Swift,Kotlin,Kotlin Multiplatform,我正在开发KMM应用程序。共享模块有一个helper类,它依赖于android部分和iOS部分的不同本机库。这是通过已知的“预期/实际”模式实现的 如上所述,iOS实际类使用iOS框架,该框架执行一些计算,并返回一个对象数组。创建对象列表的ios框架工作正常(它通过单元测试进行了测试)。下面是一个简化的例子 这是数组内部的对象类: public class ChildNodeIos: NSObject{ public let content:String public let isText
public class ChildNodeIos: NSObject{
public let content:String
public let isTextNode:Bool
public init(content:String,isTextNode:Bool=false){
self.content=content
self.isTextNode=isTextNode
}
}
iOS端返回对象列表的helper类如下所示:
@objc public class IOSCoolHelper: NSObject {
@objc public func getChildNodes(message: String) -> [ChildNodeIos] {
//build the array of child nodes here and return them
}
}
val kotlinList=mutableListOf<ChildNodeKN>()
swiftArray.foreach{
kotlinList.add(ChildNodeKN(it.content,it.isTextNode))
}
在kotlin共享模块中,在iOS预期类中,函数的调用如下所示:
@Serializable
data class ChildNodeKN(val content :String,val isTextNode :Boolean=false)
import com.mydomain.iosframeworks.IosCoolHelper
actual class CoolHelper actual constructor(private val someStuff: String) : ICoolHelper {
actual override fun getChildNodes(message: String): List<ChildNodeKN> {
val iosHelper= IOSCoolHelper()
val swiftarray:List<ChildNodeIos> = iosHelper.getChildNodes(message)
//I was expecting to do something like that but it does not work (the content of "array is always empty"):
val kotlinList:List<ChildNodeKN> = swiftarray as List<ChildNodeIos>
return kotlinList
}
}
}
@Serializable
数据类ChildNodeKN(val内容:String,val isTextNode:Boolean=false)
导入com.mydomain.iosframeworks.IosCoolHelper
实际类CoolHelper实际构造函数(private val something:String):ICoolHelper{
getChildNodes的实际覆盖(消息:String):列表{
val iosHelper=IOSCoolHelper()
val swiftarray:List=iosHelper.getChildNodes(消息)
//我本来希望做这样的事情,但它不起作用(“array总是空的”):
val kotlinList:List=瑞士航线列表
返回kotlinList
}
}
}
或者,如果swift对象列表不能直接转换为等效的kotlin对象列表,我希望能够迭代swift列表并将其转换为kotlin列表,类似于:
@objc public class IOSCoolHelper: NSObject {
@objc public func getChildNodes(message: String) -> [ChildNodeIos] {
//build the array of child nodes here and return them
}
}
val kotlinList=mutableListOf<ChildNodeKN>()
swiftArray.foreach{
kotlinList.add(ChildNodeKN(it.content,it.isTextNode))
}
val kotlinList=mutableListOf()
瑞士福雷赫酒店{
添加(ChildNodeKN(it.content,it.isTextNode))
}
但是,swift数组的内容也是空的。在做了很多测试(我现在无法复制它们)后,我成功地访问了数组中的某些内容,但它不是ChildNodeIos类型的对象,也不是我在kotlin端可以读取的内容
问题是,如何在kotlin端接收在iOS端生成的包含或多或少复杂对象的列表
我必须说,这个swift助手类有许多其他函数返回原始值(string、boolean或int),并且工作得非常好
我假设一个解决方法是使用一个包含对象的数组,从Swift端返回一个包含基本类型和二维的数组,但是如果可能的话,我希望使用一个包含对象的数组
谢谢你的帮助我自己设法找到了解决办法。问题是列表中包含的对象的Swift类的声明。我忘记了类属性的@objc声明,因为如果这样,我就无法读取返回数组中的对象 公共类ChildNodeIos:NSObject{
@objc public let content:String
@objc public let isTextNode:Bool
public init(content:String,isTextNode:Bool=false){
self.content=content
self.isTextNode=isTextNode
}
}
然后,在Kotlin方面,我没有实现将其直接转换到列表,但是使用foreach循环,在Kotlin对象中编写iOS对象非常容易: