繁体   English   中英

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

[英]Mappings and usage of Kotlin data types and Swift data types

假设我有一个 function foo ,它需要两个 arguments:

actual fun foo(list1: List<Long>, list2: List<Double>) {
...
}

根据https://kotlinlang.org/docs/tutorials/native/apple-framework.html Kotlin 的 Long 类型映射到KotlinLong和 Kotlin 的 Double 映射到KotlinDouble 现在我想从我的 iOS 应用程序中调用这个 function。 假设我有两个 arrays:

let list1Numbers = [1000.43, 564121.34, 5617172172.234, 100.7]
let list2Numbers = [2.1, 3.2, 1.7]

对于list2 ,我可以执行以下操作:

let list2NumbersKotlin = list2Numbers.map({KotlinDouble.init(double: $0)})

这不是很方便,但会起作用。 list1有点问题。 由于 Swift 中没有Long ,我做了类似的事情

let list1NumbersKotlin =  list1Numbers.map({KotlinLong.init(longLong: Int64($0))})

问题:

  1. 有更好的方法吗?

  2. 使用 Kotlin 作为 iOS 框架时,处理此类类型映射的典型方法是什么? 不幸的是,我在 Internet 上找不到任何示例。

  3. 如果我想使用 Kotlin 作为 iOS 框架,是否应该完全避免某些类型,例如 Long?

  4. 此外,关于一般映射:因为 Kotlin function

     fun testDouble(testVal: Double) {}

允许我直接传入 Swift 的 Double :

HelloKt.testDouble(testVal: Double)

那为什么 function

fun testList(testList: List<Double>) {}

不允许我输入 Double 数组但需要 KotlinDouble 数组?

HelloKt.testList(testList: [KotlinDouble]){}

传递 [Double] 会产生错误:

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

  1. 有多种方法。

您说的是位于原始类型和对象之间的数据的 collections,无论如何,这在 Kotlin 中往往是一种特殊情况。

说到这一点,在 Kotlin 中,您可能需要LongArrayDoubleArray而不是List<Long>List<Double> 来自 Swift,您将被迫明确地将它们装箱。 当您编写 Kotlin 代码时,Kotlin 会为您处理这个问题,但它们仍然在引擎盖下被装箱。

因此,总结一下,您在上面所做的事情,或者将LongArrayDoubleArray作为参数而不是列表,并进行不同的翻译。 无论哪种方式,您都需要将数据移动到与 Koltin 兼容的地方。

显然,如果你把它放在一个助手 function 中,尽管它可能很丑,你只需要做一次。

  1. 无论是你的方法还是我描述的。

  2. Long是没有问题的。 Swift 中有一个“长”,它是Int64 必须包装这样的值并不好玩,但是 Kotlin 和 Swift 是不同的语言,并且存在妥协。 如果您在 Kotlin 中使用Int而不是Long ,则需要用Int32包装 Swift Int 从这个意义上说,Kotlin Int以同样的方式“有问题”。 您需要指定您使用的精度 int 。

  3. 在 Kotlin 中, List<Long>Long对象的列表,而Long是原始值。 Kotlin 隐藏了这些值的装箱,但它们是装箱的。 Swift/Kotlin 接口迫使您更加明确。 如果您想要原始值,请使用上面提到的 ___Array forms。

以下是 Kotlin 和 Swift 类型之间的映射列表:

https://kotlinlang.org/docs/apple-framework.html#kotlin-numbers-and-nsnumber

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM