[英]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))})
問題:
有更好的方法嗎?
使用 Kotlin 作為 iOS 框架時,處理此類類型映射的典型方法是什么? 不幸的是,我在 Internet 上找不到任何示例。
如果我想使用 Kotlin 作為 iOS 框架,是否應該完全避免某些類型,例如 Long?
此外,關於一般映射:因為 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]”
您說的是位於原始類型和對象之間的數據的 collections,無論如何,這在 Kotlin 中往往是一種特殊情況。
說到這一點,在 Kotlin 中,您可能需要LongArray
和DoubleArray
而不是List<Long>
和List<Double>
。 來自 Swift,您將被迫明確地將它們裝箱。 當您編寫 Kotlin 代碼時,Kotlin 會為您處理這個問題,但它們仍然在引擎蓋下被裝箱。
因此,總結一下,您在上面所做的事情,或者將LongArray
和DoubleArray
作為參數而不是列表,並進行不同的翻譯。 無論哪種方式,您都需要將數據移動到與 Koltin 兼容的地方。
顯然,如果你把它放在一個助手 function 中,盡管它可能很丑,你只需要做一次。
無論是你的方法還是我描述的。
Long
是沒有問題的。 Swift 中有一個“長”,它是Int64
。 必須包裝這樣的值並不好玩,但是 Kotlin 和 Swift 是不同的語言,並且存在妥協。 如果您在 Kotlin 中使用Int
而不是Long
,則需要用Int32
包裝 Swift Int
。 從這個意義上說,Kotlin Int
以同樣的方式“有問題”。 您需要指定您使用的精度 int 。
在 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.