方式一 (使用extension爲結構體擴展目標類型)
https://ootips.org/yonat/swiftui-binding-type-conversion/
struct MyView: View {
@State private var currentStep: Double = 0.0
var body: some View {
Slider(value: $currentStep, in: 0.0 ... 9.0, step: 1.0)
ViewWithInt(bindingInt: $currentStep) // Error: 'Binding<Double>' is not convertible to 'Binding<Int>'
}
}
extension Double {
var int: Int {
get { Int(self) }
set { self = Double(newValue) }
}
}
ViewWithInt(bindingInt: $currentStep.int) // Works
方式二 (自定義Binging屬性)
https://blog.csdn.net/Forever_wj/article/details/121983620
struct ContentView: View {
@State private var username = ""
var body: some View {
//注意:自定義binding是放在body裏面。如果放到成員變量,則會報錯:Cannot use instance member 'xxx' within property initializer; property initializers run before 'self' is available
let binding = Binding(
get: { self.username },
set: { self.username = $0 }
)
return VStack {
// 當綁定到自定義 Binding 實例時,不需要在綁定名稱前使用 $ 符號,因爲已經閱讀了雙向綁定。
TextField("Enter your name", text: binding)
}
}
}
爲了讓body看起來簡潔,應該把子view封裝到成員變量
struct ContentView: View {
@State private var username = ""
var body: some View {
VStack {
myView
otherView...
}
var myView: some view {
let binding = Binding(
get: { self.username },
set: { self.username = $0 }
)
return VStack {
TextField("Enter your name", text: binding)
}
}
}