Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/119.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在KMM(kotlin native)共享模块中读取Swift框架库中生成的对象数组_Ios_Swift_Kotlin_Kotlin Multiplatform - Fatal编程技术网

Ios 如何在KMM(kotlin native)共享模块中读取Swift框架库中生成的对象数组

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

我正在开发KMM应用程序。共享模块有一个helper类,它依赖于android部分和iOS部分的不同本机库。这是通过已知的“预期/实际”模式实现的

如上所述,iOS实际类使用iOS框架,该框架执行一些计算,并返回一个对象数组。创建对象列表的ios框架工作正常(它通过单元测试进行了测试)。下面是一个简化的例子

这是数组内部的对象类:

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对象非常容易: