Ios Kotlin数据类型和Swift数据类型的映射和使用
假设我有一个函数foo,它有两个参数:Ios Kotlin数据类型和Swift数据类型的映射和使用,ios,swift,kotlin,kotlin-multiplatform,kotlin-native,Ios,Swift,Kotlin,Kotlin Multiplatform,Kotlin Native,假设我有一个函数foo,它有两个参数: actual fun foo(list1: List<Long>, list2: List<Double>) { ... } 对于列表2,我可以做如下操作: let list2NumbersKotlin = list2Numbers.map({KotlinDouble.init(double: $0)}) 这不是很方便,但会起作用。list1有点问题。因为Swift中没有长的,所以我会这样做 let list1NumbersKo
actual fun foo(list1: List<Long>, list2: List<Double>) {
...
}
对于列表2
,我可以做如下操作:
let list2NumbersKotlin = list2Numbers.map({KotlinDouble.init(double: $0)})
这不是很方便,但会起作用。list1
有点问题。因为Swift中没有长的,所以我会这样做
let list1NumbersKotlin = list1Numbers.map({KotlinLong.init(longLong: Int64($0))})
问题:
fun testDouble(testVal: Double) {}
HelloKt.testDouble(testVal: Double)
那么为什么这个功能
fun testList(testList: List<Double>) {}
传递[Double]会产生错误:
无法将“[Double]”类型的值转换为预期的参数类型
“[KotlinDouble]”
LongArray
和DoubleArray
而不是List
和List
。来自Swift,您将被迫显式地将其装箱。当您编写Kotlin代码时,Kotlin将为您处理这一问题,但他们仍然受到限制
所以,总结一下,或者您上面所做的,或者将LongArray
和DoubleArray
作为参数而不是列表,并进行不同的转换。无论哪种方式,您都需要将数据移动到与Koltin兼容的位置
显然,如果你把它放在一个助手函数中,尽管它可能很难看,你只需要做一次
Long
没有问题。Swift中有一个“long”,它是Int64
。像这样包装价值观并不有趣,但Kotlin和Swift是不同的语言,而且有折衷之处。如果在Kotlin中使用Int
而不是Long
,则需要使用Int32
包装SwiftInt
。从这个意义上讲,KotlinInt
也是“有问题的”。您需要指定使用的精度int
List
是Long
对象的列表,而只有Long
是基本值。Kotlin隐藏了这些值的装箱,但它们是装箱的。Swift/Kotlin接口迫使您更加明确。如果需要基元值,请使用上面提到的__数组形式
谢谢你的回答。通过迭代Swift Double数组,并将索引转换为Int32的所有元素添加到新数组中,我可以将___;数组形式与现有的Swift Double数组一起使用。我注意到还有一个传递init函数(KotlinInt)->(KotlinDouble)的选项,但我不确定它应该是什么样子。您知道Swift中使用Kotlin集合的任何代码示例或引用吗?我花了很多时间搜索,但结果为0。另外:如何有效地处理大量数据?映射一个包含30个元素的数组不是问题,但是我有一个包含数千个元素的数组,整个过程需要花费大量的时间。
fun testList(testList: List<Double>) {}
HelloKt.testList(testList: [KotlinDouble]){}