@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 } } }