しめ鯖日記

swift, iPhoneアプリ開発, ruby on rails等のTipsや入門記事書いてます

SwiftUIの@Stateを動かしてみる

@Stateについて調べてみました

@Stateは下のようにView内の変数で利用します

struct ContentView: View {
    @State var test = 0
    
    var body: some View {
        VStack {
            Text("\(test)")
            Button(action: {
                test += 1
            }, label: {
                Text("Button")
            })
        }
        .padding()
    }
}

アプリを起動すると下のような画面になります
ViewへのBindingもしてくれるので、ボタンをタップするとTextの値が自動的に書き換わります

@Stateを外すと下のようなエラーが出ます
これはContentViewがstructな事が原因です、structの変数はmutableなメソッド以外で変更できなくなっています

Left side of mutating operator isn't mutable: 'self' is immutable

@Stateについてもう少し掘り下げてみます
@Stateですが下のように定義されています

@available(iOS 13.0, macOS 10.15, tvOS 13.0, watchOS 6.0, *)
@frozen @propertyWrapper public struct State<Value> : DynamicProperty {
}

Stateを@Stateという形でかけるのは@propertyWrapperによるものです
下のようにMyPropertyWrapperを定義すれば@MyPropertyWrapper var test = 0という形で書くことができるようになります

@propertyWrapper class MyPropertyWrapper {
    var value: Int
    
    init(wrappedValue: Int) {
        self.value = wrappedValue
    }
    
    var wrappedValue: Int {
        get {
            value
        }
        set {
            value = newValue
        }
    }
}