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
相关产品推荐
相关产品推荐

