SwiftUI Binding 的扩展 onChange 说明及代码演示

16 min read

SwiftUI 中的 Binding 提供了一种将值传递到视图的方式,同时也可以在视图中修改值。在修改值的同时,我们希望能够得到一个通知,以便执行一些额外的操作。这时就可以使用 Binding 的扩展 onChange。在这篇文章中,我们将讨论 Binding 的扩展 onChange 的功能及其使用示例。

Binding 的扩展 onChange 可以在绑定值发生更改时执行一些操作。具体示例如下:

extension Binding {
    func onChange(_ handler: @escaping (Value) -> Void) -> Binding<Value> {
        Binding(
            get: { self.wrappedValue },
            set: {
                self.wrappedValue = $0
                handler($0)
            }
        )
    }
}

这个扩展方法接受一个带有一个参数的闭包(该参数的类型为绑定值的类型),并返回一个新的绑定对象。这个新的绑定对象与原始绑定对象非常相似,只是在设置值时会同时调用传入的闭包。

让我们看一个使用该扩展的示例。假设我们有一个视图,其中使用了一个绑定来控制文本框中显示的文本。我们希望在文本框中输入文本时同时打印出正在输入的文本。

struct ContentView: View {
    @State private var text = ""
    
    var body: some View {
        TextField("Enter something", text: $text.onChange(handleTextChange))
    }
    
    func handleTextChange(text: String) {
        print(text)
    }
}

在上面的示例中,我们调用了 Binding 的扩展方法 onChange,并传入了一个名为 handleTextChange 的方法。当输入文本框中的文本时,handleTextChange 方法将处理传递到输入文本。因此,在绑定值(即文本)更改时,将同时调用 handleTextChange 方法。

通过上述示例,我们可以发现,Binding 的扩展方法 onChange 可以帮助我们在绑定值发生更改时执行一些操作。其主要优点是能够避免重复代码。当需要在多个视图中执行相同操作时,只需在一个地方定义该操作并将其传递到所需位置。