我正在制作一个多平台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访问它们。
但是像NSInteger
或BOOL
这样的ObjC原语不支持可选。因此,当你在Kotlin中声明一个可选原语时,它被转换为KotlinNumber
,因为在ObjC中需要一个对象来存储可选值。
KotlinNumber
是NSNumber
的子类,所以你可以这样使用它:
isLiked?.boolValue