You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KMM项目中KotlinBoolean无法转换为Swift Bool类型问题如何解决?

KMM 跨平台 KotlinBoolean 转 Swift Bool 解决方案

报错原因

KMM 桥接层会将 Kotlin 侧的可空 Boolean? 类型映射为 Swift 侧的 KotlinBoolean 类类型,和 Swift 原生的值类型 Bool 不兼容,因此直接传值会触发类型不匹配的编译错误。

可选解决方案

方案1:单次安全类型转换(临时快速修复)

不要直接使用系统提示的强制转换 as! Bool,空值场景下会触发运行时崩溃,改用可选绑定配合空合运算符处理:

SelectFavouriteButton(selected: (advert?.isLiked as? Bool) ?? false) { isPressed in
    self.action(isPressed, advert?.id ?? "" , false)   
}

方案2:全局扩展统一转换(降低重复代码)

给 KotlinBoolean 加 Swift 扩展,封装通用转换逻辑,后续所有同类型场景都可以直接调用:

extension KotlinBoolean {
    /// 转换为 Swift 原生 Bool 类型,空值默认返回 false
    func toSwiftBool(defaultValue: Bool = false) -> Bool {
        self as? Bool ?? defaultValue
    }
}

调用示例:

SelectFavouriteButton(selected: advert?.isLiked.toSwiftBool() ?? false) { isPressed in
    self.action(isPressed, advert?.id ?? "" , false)   
}

方案3:Kotlin 侧根源优化(推荐)

如果业务逻辑中 isLiked 不会为空,直接将 Kotlin 类的属性声明为非空 Boolean 类型,KMM 会直接将其映射为 Swift 原生 Bool 类型,无需额外转换。
如果业务必须保留可空属性,可以在 Kotlin 共享层新增非空默认值的扩展属性,屏蔽端侧转换逻辑:

val Data.isLikedOrDefault: Boolean get() = isLiked ?: false

Swift 侧直接调用扩展属性即可拿到原生 Bool 值:

SelectFavouriteButton(selected: advert?.isLikedOrDefault ?? false) { isPressed in
    self.action(isPressed, advert?.id ?? "" , false)   
}

内容的提问来源于stack exchange,提问作者Russ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 16:36:04