我有一个带有可选绑定布尔变量的视图。我想仅从某些视图向其传递变量。我遇到的问题是,当我传递变量时,我收到错误“无法将类型'Binding'的值转换为预期参数类型'Binding
Heading(text: "Heading1") // error: Missing argument for parameter 'toggle' in call
Heading(text: "Heading2", toggle: $booleanVar) // Cannot convert value of type 'Binding<Bool>' to expected argument type 'Binding<Bool?>'
struct Heading: View {
@State var text: String
@Binding var toggle: Bool?
var body: some View {
VStack {
Spacer()
.frame(height: 25)
HStack {
Text(text)
.font(.system(size: 36))
Spacer()
if text == "str" {
Button(action: { toggle!.toggle() }) {
Image(systemName: "plus")
.foregroundColor(.black)
.font(.system(size: 36))
}
}
}
Spacer()
.frame(height: 25)
}
}
}
看来您想要的是
Binding<Bool>?
,而不是 Binding<Bool?>
。前者不能声明为属性包装器。
您应该将其声明为常规
let
属性:
struct Heading: View {
// text should not be a @State either!
let text: String
let toggleBinding: Binding<Bool>?
从
body
中的代码来看,当 text
为“str”时,您似乎希望调用者传入非零绑定。在这种情况下,我将通过编写两个初始化程序来强制执行此操作:
init(toggle: Binding<Bool>) {
self.text = "str"
self.toggleBinding = toggle
}
init(text: String) {
self.text = text
self.toggleBinding = nil
}
您应该像任何其他可选选项一样安全地解开绑定,而不是强制解开绑定:
if let toggleBinding {
Button(action: { toggleBinding.wrappedValue.toggle() }) {
Image(systemName: "plus")
.foregroundColor(.black)
.font(.system(size: 36))
}
}
请注意,您必须
toggle()
toggleBinding.wrappedValue
,而不仅仅是toggleBinding
。