SwiftUI Int to Binding【数値を文字列バインディング】

Pocket

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のところのStringIntに変更してみましょう。

上記のようにIntToStrDefが追加されています。

struct ContentView: View {
    @State var i1: Int = 0
    var body: some View {
        VStack{
            TextField("Edit1",text: $i1.IntToStrDef(0)) 
        }
    }
}

上記のようにIntBindingできました。

https://forums.swift.org/t/promoting-binding-value-to-binding-value/31055

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA