簡體   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