Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.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 Kotlin数据类型和Swift数据类型的映射和使用_Ios_Swift_Kotlin_Kotlin Multiplatform_Kotlin Native - Fatal编程技术网

Ios Kotlin数据类型和Swift数据类型的映射和使用

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

假设我有一个函数foo,它有两个参数:

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))})
问题:

  • 有更好的方法吗

  • 当使用Kotlin作为iOS框架时,处理此类类型映射的典型方法是什么?不幸的是,我在网上找不到任何例子

  • 如果我想使用Kotlin作为iOS框架,是否应该完全避免使用诸如Long之类的特定类型

  • 另外,关于一般的映射:由于Kotlin函数

     fun testDouble(testVal: Double) {}
    
  • 允许我直接通过Swift双倍:

    HelloKt.testDouble(testVal: Double)
    
    那么为什么这个功能

    fun testList(testList: List<Double>) {}
    
    传递[Double]会产生错误:

    无法将“[Double]”类型的值转换为预期的参数类型 “[KotlinDouble]”

  • 有多种方法
  • 您所说的数据集合位于基本类型和对象之间,这在Kotlin中通常是一个特例

    说到这一点,在Kotlin中,您可能需要
    LongArray
    DoubleArray
    而不是
    List
    List
    。来自Swift,您将被迫显式地将其装箱。当您编写Kotlin代码时,Kotlin将为您处理这一问题,但他们仍然受到限制

    所以,总结一下,或者您上面所做的,或者将
    LongArray
    DoubleArray
    作为参数而不是列表,并进行不同的转换。无论哪种方式,您都需要将数据移动到与Koltin兼容的位置

    显然,如果你把它放在一个助手函数中,尽管它可能很难看,你只需要做一次

  • 要么是你的方法,要么是我描述的

  • Long
    没有问题。Swift中有一个“long”,它是
    Int64
    。像这样包装价值观并不有趣,但Kotlin和Swift是不同的语言,而且有折衷之处。如果在Kotlin中使用
    Int
    而不是
    Long
    ,则需要使用
    Int32
    包装Swift
    Int
    。从这个意义上讲,Kotlin
    Int
    也是“有问题的”。您需要指定使用的精度int

  • 在Kotlin中,
    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]){}