SwiftUIは、View側のBindingを使うことで変数などの変更を即表示させることが可能です。
TextFieldの引数textはBinding<String>型なので@Stateなどの文字列変数をBindingできます。
struct ContentView: View { @State var str1: String = "文字列" var body: some View { VStack{ TextField("Edit1",text: $str1) } } }
しかし、@Stateを数値にしている場合TextFieldのtextにバインディング設定できません。
Cannot convert value of type 'Binding<Int>' to expected argument type 'Binding<String>'
このような場合extension Binding でBinding<Int>からBinding<String>変換します。
extension Binding where Value == Int { func IntToStrDef(_ def: Int) -> Binding<String> { return Binding<String>(get: { return String(self.wrappedValue) }) { value in self.wrappedValue = Int(value) ?? def } } }
extensionの設定が完了したら@State varのところのStringをIntに変更してみましょう。
上記のようにIntToStrDefが追加されています。
struct ContentView: View { @State var i1: Int = 0 var body: some View { VStack{ TextField("Edit1",text: $i1.IntToStrDef(0)) } } }
上記のようにIntがBindingできました。
https://forums.swift.org/t/promoting-binding-value-to-binding-value/31055