SwiftUI Binding數據類型轉換

方式一 (使用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)
        }
    }
    
        
}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章