代码之家  ›  专栏  ›  技术社区  ›  Joe Scotto

.onChange()-无法将“Double”类型的值转换为所需的参数类型“()”

  •  1
  • Joe Scotto  · 技术社区  · 3 年前

    我正在尝试检测我的 @State 变量来更新一些文本,但我无法使其工作,因为 .onChange 修饰符正在引发此错误:

    无法将类型为“Double”的值转换为所需的参数类型“()”

    struct CalcView: View {
        @State private var width = 0.0
    
        var body: some View {
            VStack {
                Button(action: {
                    width += 1.0
                }, label: {
                    Text("Increment width")
                })
            }
            .onChange(of: width) { // This line specifically 
                print("Width Changed")
            }
        }
    }
    
    1 回复  |  直到 3 年前
        1
  •  7
  •   hush-entangle    3 年前

    使用onChange修饰符调用的闭包不接受任何参数,但onChange希望将Double传递给该闭包。尝试更改 .onChange(of: width) { 对此:

    .onChange(of: width) { newWidth in

        2
  •  1
  •   mgsulaiman    3 年前

    再也不会陷入困境 启动类型方法名称,然后等待完成

    .onChange

    完成将弹出方法的详细信息 与论点

    现在您可以看到.onChange()想要一个符合Equatable协议的值 see more about Equatable

    因为“width”值类型是Double类型,所以它符合Equatable

    .onChange(of: Equatable, perform: (Equatable) -> Void)
    

    可以按enter键传递perform中的闭包

     .onChange(of: width, perform: { newValue in   })
    

    如果不想使用newValue,请将其更改为_

    .onChange(of: width, perform: { _ in   })
    

    或者您甚至可以传递具有(Equatable)->空隙类型

      .onChange(of: width, perform: performOnChangeAction)
    
    
    func performOnChangeAction<T: Equatable>(newValue: T){
        print(newValue)
    }
    

    T是符合Equatable的泛型类型。了解更多信息 generics

    请注意,您不能更改newValue newValue

    您可以随时根据自己的条件访问和更改宽度值

      .onChange(of: width, perform: { newValue in
                            if newValue >= 10.0{return}
                            if newValue >= 20.0 {
                                widthError = true
                                width = 0.0
                            }
                        })
    

    但这会导致视图中的代码更加复杂,并有可能进入无限循环,因为每次更改宽度时都会触发.onChange()