无法将 'KotlinBoolean' 类型的值转换为预期的参数类型 'Bool'



我正在制作一个多平台KMM项目,我在为button属性分配动态值时遇到了麻烦。

我有一个like按钮它会根据selected属性改变它的状态:

struct SelectFavouriteButton: View {

@State var selected = false    
let action: (Bool) -> Void

var body: some View {
Button(action: {
selected.toggle()
self.action(selected)
}) {
Image(systemName: selected ? "heart.fill" : "heart" )
.foregroundColor(.accentRed)
}
}
}

来自Kotlin部分的视图模型:

@Serializable
data class Data(
...
var isLiked: Boolean? = null,
var isSaved: Boolean? = null,
...
}

和这个按钮所在的视图:

struct CellView: View {

@State var advert: Data?
var body: some View {
// Cannot convert value of type 'KotlinBoolean' to expected argument type 'Bool'
// Insert ' as! Bool'
SelectFavouriteButton(selected: advert?.isLiked ?? false){ isPressed in   // Error is here
self.action(isPressed, advert?.id ?? "" , false)   
}
}
}

我应该使用映射吗?如果是,在当前环境下我该如何做?请帮助

由于这是"将bool转换为kotlinboolean"的搜索结果,我将把它放在这里,以供像我这样的开发人员使用:

let selected = KotlinBoolean(bool: swiftObject.selected)

Kotlin原语在swift中转移到NSNumber,所以尝试以下(未测试-仅提供想法)

let linked = advert.isLiked as? NSNumber // or NSNumber?
SelectFavouriteButton(selected: linked?.boolValue ?? false){ isPressed in
self.action(isPressed, advert?.id ?? "" , false)   
}

@Asperi的建议应该是可行的,但是推理并不完全正确。

Kotlin原语可以完美地转换为ObjC原语,并且可以很容易地从Swift访问它们。

但是像NSIntegerBOOL这样的ObjC原语不支持可选。因此,当你在Kotlin中声明一个可选原语时,它被转换为KotlinNumber,因为在ObjC中需要一个对象来存储可选值。

KotlinNumberNSNumber的子类,所以你可以这样使用它:

isLiked?.boolValue

最新更新