可选绑定参数

问题描述 投票:0回答:1

我有一个带有可选绑定布尔变量的视图。我想仅从某些视图向其传递变量。我遇到的问题是,当我传递变量时,我收到错误“无法将类型'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)
            
        }
    }
}
swift swiftui
1个回答
0
投票

看来您想要的是

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

© www.soinside.com 2019 - 2024. All rights reserved.