以下是创建一个名为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
包装了用于存储和操作状态变量的内部变量,并将其使用作为文本和按钮的数据源。