更新到 Kotlin 1.4.10 后 KotlinPair 出现问题
Issue with KotlinPair after updating to Kotlin 1.4.10
我将 Kotlin Multiplatform 项目从 Kotlin 1.3.72 更新到 1.4.10,当我尝试构建代码时遇到如下问题:
- LocationStepCardView.swift:13:19:对泛型类型 'KotlinPair' 的引用需要 <...>
中的参数
- LocationStepCardView.swift:28:24:通用 class 'KotlinPair' 要求 'Double' 是 class 类型
当我在没有更新到 kotlin 1.4.10 的情况下回滚到分支时,一切正常。
代码:
commonMain.kt
interface LocationView {
var location: Pair<Latitude, Longitude>?
fun setOnSavingLocationPermissionProceedAction(action: () -> Unit)
fun setOnSavingLocationPermissionSkipAction(action: () -> Unit)
fun setOnSavingLocationPermissionAllowAction(action: (Pair<Latitude, Longitude>?) -> Unit)
fun setOnSavingLocationPermissionDenyAction(action: () -> Unit)
}
LatitudeCommon.kt
inline class Latitude(val value: Double)
LongitudeCommon.kt
inline class Longitude(val value: Double)
LocationStepCardView.swift
import kotlinProjectCommon
extension LocationStepCardView: LocationView {
var location: KotlinPair? {
get { currentLocation as? KotlinPair }
set { currentLocation = newValue }
}
func setOnSavingLocationPermissionProceedAction(action: @escaping () -> Void) {
proceedAction = action
}
func setOnSavingLocationPermissionSkipAction(action: @escaping () -> Void) {
skipAction = action
}
func setOnSavingLocationPermissionAllowAction(action: @escaping (KotlinPair?) -> Void) {
onLocationUpdateAction = { (latitude: Double, longitude: Double) in
let pair = KotlinPair(first: latitude, second: longitude)
action(pair)
}
}
func setOnSavingLocationPermissionDenyAction(action: @escaping () -> Void) {
onDeniedLocationAction = action
}
}
我猜是因为 Objective-C 现在默认启用泛型。您可以使用 -Xno-objc-generics
.
禁用它们
https://kotlinlang.org/docs/reference/native/objc_interop.html#generics
至于“需要是 class 类型”,我认为这意味着您需要显式转换为 KotlinDouble
。禁用泛型 可能 恢复该问题,但 YMMV。
我将 Kotlin Multiplatform 项目从 Kotlin 1.3.72 更新到 1.4.10,当我尝试构建代码时遇到如下问题:
- LocationStepCardView.swift:13:19:对泛型类型 'KotlinPair' 的引用需要 <...> 中的参数
- LocationStepCardView.swift:28:24:通用 class 'KotlinPair' 要求 'Double' 是 class 类型
当我在没有更新到 kotlin 1.4.10 的情况下回滚到分支时,一切正常。
代码:
commonMain.kt
interface LocationView {
var location: Pair<Latitude, Longitude>?
fun setOnSavingLocationPermissionProceedAction(action: () -> Unit)
fun setOnSavingLocationPermissionSkipAction(action: () -> Unit)
fun setOnSavingLocationPermissionAllowAction(action: (Pair<Latitude, Longitude>?) -> Unit)
fun setOnSavingLocationPermissionDenyAction(action: () -> Unit)
}
LatitudeCommon.kt
inline class Latitude(val value: Double)
LongitudeCommon.kt
inline class Longitude(val value: Double)
LocationStepCardView.swift
import kotlinProjectCommon
extension LocationStepCardView: LocationView {
var location: KotlinPair? {
get { currentLocation as? KotlinPair }
set { currentLocation = newValue }
}
func setOnSavingLocationPermissionProceedAction(action: @escaping () -> Void) {
proceedAction = action
}
func setOnSavingLocationPermissionSkipAction(action: @escaping () -> Void) {
skipAction = action
}
func setOnSavingLocationPermissionAllowAction(action: @escaping (KotlinPair?) -> Void) {
onLocationUpdateAction = { (latitude: Double, longitude: Double) in
let pair = KotlinPair(first: latitude, second: longitude)
action(pair)
}
}
func setOnSavingLocationPermissionDenyAction(action: @escaping () -> Void) {
onDeniedLocationAction = action
}
}
我猜是因为 Objective-C 现在默认启用泛型。您可以使用 -Xno-objc-generics
.
https://kotlinlang.org/docs/reference/native/objc_interop.html#generics
至于“需要是 class 类型”,我认为这意味着您需要显式转换为 KotlinDouble
。禁用泛型 可能 恢复该问题,但 YMMV。