无法将“Double”类型的值分配给“Binding<Double>”类型

时间:2021-04-29 06:03:45

标签: swift swiftui binding

我希望用户通过选择器选择他的身高。然后想将用户的身高(以英寸或厘米为单位)记录到我的 ContenvtView 结构中的 Double 变量中。但是,不能为我的 @Binding Double 分配任何值。 Xcode 在标题上大喊大叫,或者说我无法将 Double 分配给 Binding。我错过了什么?代码如下:

struct HeightPicker:视图 {

        @State var foot = 0.0
        @State var inch = 0.0
        @State var meter = 0.0
        @State var cm = 0.0
        @State var measurement = ""
        @Binding var metric: Bool
        @Binding var height: Double
        

        var feet = [Int](0..<10)
        var inches = [Int](0..<12)
        var meters = [Int](0..<3)
        var cms = [Int](0..<100)
        var measurements = ["in", "cm" ]
        
        var body: some View{
            VStack{
                GeometryReader() { geometry in
                    
                    HStack {
                        
                        if(metric == false) {
                            
                            Picker(selection: self.$foot, label: Text("")) {
                                ForEach(0 ..< self.feet.count){ index in
                                    Text("\(self.feet[index])").tag(self.feet[index])
                                }
                            }
                            .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                            .clipped()
                            .scaleEffect(CGSize(width: 1.0, height: 1.0))
                            .pickerStyle(WheelPickerStyle())
                            .scaledToFit()
                            .background(Color.white)
                            
                            Text("\"")
                            
                            
                            Picker(selection: self.$inch, label: Text("")) {
                                ForEach(0 ..< self.inches.count){ index in
                                    Text("\(self.inches[index])").tag(self.inches[index])
                                }
                            }
                            .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                            .clipped()
                            .scaleEffect(CGSize(width: 1.0, height: 1.0))
                            .pickerStyle(WheelPickerStyle())
                            .scaledToFit()
                            .background(Color.white)

                            var heightInches = (self.foot * 12) + self.inch
                            
                     
                            
                            
                        
                            Text("'")
                        
                            self.$height = heightInches
                            
                        } else if(metric == true) {
                            Picker(selection: self.$meter, label: Text("")) {
                                ForEach(0 ..< self.meters.count){ index in
                                    Text("\(self.meters[index])").tag(self.meters[index])
                                }
                            }
                            .frame(width: geometry.size.width/4, height: geometry.size.height, alignment: .center)
                            .scaleEffect(CGSize(width: 1.0, height: 1.0))
                            .clipped()
                            .pickerStyle(WheelPickerStyle())
                            .scaledToFit()
                            .background(Color.white)

                            
                            Text("m")
                            
                            
                            Picker(selection: self.$cm, label: Text("")) {
                                ForEach(0 ..< self.cms.count){ index in
                                    Text("\(self.cms[index])").tag(self.cms[index])
                                }
                            }
                            .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                            .clipped()
                            .scaleEffect(CGSize(width: 1.0, height: 1.0))
                            .pickerStyle(WheelPickerStyle())
                            .scaledToFit()
                            .background(Color.white)

                            Text("cm")


                        }
                        
                    }
              
                    
                }.frame(height: 45)
            }
            .frame(height: 45)
            .padding(.top,5)
            .padding(.bottom, 5)
            
        }
    }

}

1 个答案:

答案 0 :(得分:0)

您不能只在视图中间执行此操作:

var heightInches = (self.foot * 12) + self.inch
self.$height = heightInches
                        

试试这个例子:

struct HeightPicker: View {
    
    @State var foot: Int = 0    // <---
    @State var inch: Int = 0    // <---
    @State var meter: Int = 0   // <---
    @State var cm: Int = 0  // <---
    @State var measurement = ""
    
    @Binding var metric: Bool
    @Binding var height: Double
    
    var feet = [Int](0..<10)
    var inches = [Int](0..<12)
    var meters = [Int](0..<3)
    var cms = [Int](0..<100)
    var measurements = ["in", "cm" ]
    
    var body: some View{
        VStack{
            GeometryReader() { geometry in
                
                HStack {
                    
                    if !metric {    // <---
                        
                        Picker(selection: self.$foot, label: Text("")) {
                            ForEach(0 ..< self.feet.count){ index in
                                Text("\(self.feet[index])").tag(self.feet[index])
                            }
                        }
                        // add this
                        .onChange(of: foot) { _ in
                            self.height = Double(self.foot * 12 + self.inch)
                            print("--> height: \(height)")
                        }
                        .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                        .clipped()
                        .scaleEffect(CGSize(width: 1.0, height: 1.0))
                        .pickerStyle(WheelPickerStyle())
                        .scaledToFit()
                        .background(Color.white)
                        
                        Text("\"")
                        
                        Picker(selection: self.$inch, label: Text("")) {
                            ForEach(0 ..< self.inches.count){ index in
                                Text("\(self.inches[index])").tag(self.inches[index])
                            }
                        }
                        // add this
                        .onChange(of: inch) { _ in
                            self.height = Double(self.foot * 12 + self.inch)
                            print("--> height: \(height)")
                        }
                        .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                        .clipped()
                        .scaleEffect(CGSize(width: 1.0, height: 1.0))
                        .pickerStyle(WheelPickerStyle())
                        .scaledToFit()
                        .background(Color.white)
 
                        Text("'")

                    } else {
                        Picker(selection: self.$meter, label: Text("")) {
                            ForEach(0 ..< self.meters.count){ index in
                                Text("\(self.meters[index])").tag(self.meters[index])
                            }
                        }
                        .frame(width: geometry.size.width/4, height: geometry.size.height, alignment: .center)
                        .scaleEffect(CGSize(width: 1.0, height: 1.0))
                        .clipped()
                        .pickerStyle(WheelPickerStyle())
                        .scaledToFit()
                        .background(Color.white)
                        
                        Text("m")
                        
                        Picker(selection: self.$cm, label: Text("")) {
                            ForEach(0 ..< self.cms.count){ index in
                                Text("\(self.cms[index])").tag(self.cms[index])
                            }
                        }
                        .frame(width: geometry.size.width/4,height: geometry.size.height, alignment: .center)
                        .clipped()
                        .scaleEffect(CGSize(width: 1.0, height: 1.0))
                        .pickerStyle(WheelPickerStyle())
                        .scaledToFit()
                        .background(Color.white)
                        
                        Text("cm")
                    }
                }
            }.frame(height: 45)
        }
        .frame(height: 45)
        .padding(.top,5)
        .padding(.bottom, 5)
    }
}