SwiftUI如何创建自定义绑定? 代码演示

26 min read

以下是创建一个名为MyBinding的自定义绑定的示例:

struct MyBinding<T> {
    let get: () -> T
    let set: (T) -> Void
    
    var wrappedValue: T {
        get { get() }
        nonmutating set { set(newValue) }
    }
    
    init(get: @escaping () -> T, set: @escaping (T) -> Void) {
        self.get = get
        self.set = set
    }
}

extension MyBinding {
    init(get: @escaping () -> T, set: @escaping (T) -> Void) where T: Equatable {
        self.init(get: get, set: set)
    }
    
    static func constant(_ value: T) -> MyBinding<T> {
        MyBinding<T>(get: { value }, set: { _ in })
    }
}

您可以在自定义视图中使用自定义绑定。例如:

struct MyView: View {
    @State private var myValue: Int = 0
    private var myBinding: MyBinding<Int> {
        MyBinding(get: { self.myValue },
                  set: { self.myValue = $0 })
    }
    
    var body: some View {
        Text("Value: \(myBinding.wrappedValue)")
        Button("Increment") {
            myBinding.wrappedValue += 1
        }
    }
}

在此示例中,我们使用MyBinding包装了用于存储和操作状态变量的内部变量,并将其使用作为文本和按钮的数据源。