gpt4 book ai didi

swift - SwiftUI 中带有自定义绑定(bind)的可选扩展

转载 作者:行者123 更新时间:2023-12-02 19:18:49 44 4
gpt4 key购买 nike

有没有办法为 Optional 值创建一个扩展,这样我们就不需要单独创建自定义绑定(bind)。

class ViewModel: ObservableObject {
@Published var text: String?
}

struct ContentView: View {
@ObservedObject var model: ViewModel

var body: some View {
let binding = Binding(
get: { self.model.text ?? "" },
set: { self.model.text = $0 }
)

return VStack {
TextField("Text", text: binding)
}
}
}

我正在考虑做这样的事情

extension Optional where Wrapped == String {
func optionalBinding() -> Binding<String> {
return Binding(get: {
self ?? ""
}, set: { newValue in
self = newValue
})
}
}

对此有什么建议吗?

最佳答案

您可以尝试扩展 Binding 而不是 Optional:

extension Binding where Value == String? {
var optionalBinding: Binding<String> {
.init(
get: {
self.wrappedValue ?? ""
}, set: {
self.wrappedValue = $0
}
)
}
}

然后像这样使用它:

class ViewModel: ObservableObject {
@Published var text: String?
}

struct ContentView: View {
@ObservedObject var model = ViewModel()

var body: some View {
VStack {
TextField("Text", text: $model.text.optionalBinding)
Text(String(describing: model.text))
}
}
}

关于swift - SwiftUI 中带有自定义绑定(bind)的可选扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63341176/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com