KMP与Swift交互:Double?转KotlinDouble?及空值传递问题
解决KMP可空Double与Swift Optional Double的参数传递问题
在Kotlin Multiplatform(KMP)项目中,Kotlin的Double?类型在iOS端会被桥接为KotlinDouble?,直接传递Swift的Double?会出现类型不匹配错误;同时你需要让coreDiameter在解析失败时保留null而非默认0,以下是具体解决方案:
1. 修复Swift Optional Double到KotlinDouble?的类型转换问题
方式一:直接用flatMap处理空值
在调用CreateRequest时,通过flatMap自动处理空值逻辑,非空时创建KotlinDouble实例,为空则直接传nil:
CreateRequest( length: self.rollerLength.flatMap { KotlinDouble(double: $0) }, coreDiameter: self.rollerCoreDiameter.flatMap { KotlinDouble(double: $0) }, ... )
方式二:封装扩展实现复用
如果需要多处使用这种转换,可以给Swift的Optional<Double>写一个扩展,简化调用:
extension Optional where Wrapped == Double { var toKotlinDouble: KotlinDouble? { guard let value = self else { return nil } return KotlinDouble(double: value) } }
之后调用代码会更简洁:
CreateRequest( length: self.rollerLength.toKotlinDouble, coreDiameter: self.rollerCoreDiameter.toKotlinDouble, ... )
2. 让coreDiameter保留null而非默认0
移除原来代码中?? 0.0的默认值逻辑,直接保留解析后的可选结果即可。假设rollerCoreDiameter是字符串类型,解析时这样处理:
// 从字符串解析Double,失败时返回nil let coreDiameterDouble = self.rollerCoreDiameter.flatMap { Double($0) } CreateRequest( ... coreDiameter: coreDiameterDouble.toKotlinDouble, ... )
这样当输入为空或解析失败时,coreDiameterDouble为nil,最终传递给KMP的参数也会是nil,符合需求。
内容的提问来源于stack exchange,提问作者Danijal Azerovic
相关产品推荐
相关产品推荐

