【Swift UI】@Stateの意味と使い方とは?mutatingとの違い
この記事からわかること
- Swiftの@Stateとは?
- 意味や使い方、メリット
- 構造体のプロパティを変更する方法
- mutatingとは?
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swift UIでView構造体の中で定義したプロパティをbody内で変更できるようにしたい時などに使用する「@State」の使い方やメリットをまとめていきたいと思います。
@Stateとは?
@State
はSwift5.1から導入された機能「Property Wrapper(プロパティラッパ)」の1つです。プロパティラッパの特徴はプロパティに対する操作や処理をカプセル化して定義することでキーワードを追加するだけで任意の動作や挙動を行わせることができるデータ構造です。@XXXX
形式で自分で定義することも可能です。定義する際は「@propertywrapper
」を定義前に記述します。
既に定義済みである@State
の特徴は指定したプロパティの値の更新を監視してくれることです。これにより構造体のプロパティをその構造体の内部から更新できるようになったり、更新されたプロパティが都度再評価されView(表示)も更新してくれます。
@State(@propertywrapper)〜まとめ〜
- 「Property Wrapper(プロパティラッパ)」の1つ
- プロパティへの処理をカプセル化してくれる
- プロパティの値の更新を監視してくれる
- プロパティの変更を許容してくれる
「Property Wrapper(プロパティラッパ)」には他にも子の構造体から親の構造体のプロパティを変更できるようにする@Binding
やクラス(オブジェクト)を観測できる@ObservedObject
などが用意されています。
使い方
@State
の使い方は簡単で構造体の中に定義しているプロパティ宣言に@State
を付与するだけです。これにより指定したプロパティを監視してくれるようになります。
使用例
struct ContentView: View {
@State var check = true
var body: some View {
Button(action: {
check.toggle() // 真偽値を逆転させるモディファイア
}){
Text(check ? "ON" : "OFF")
}
}
構造体のプロパティを変更する:mutating
そもそも構造体の中に定義したプロパティはそのままでは内部から変更することができません。例えば以下のようにCharacter構造体
のhitPointプロパティ
の値を変更しようとするとエラーが発生してしまいます。
struct Character {
var hitPoint: Int = 100
func damage() {
hitPoint -= 30
}
}
発生するエラー
Left side of mutating operator isn't mutable: 'self' is immutable
// ミューテーション演算子の左側は可変ではありません:'self'は不可変です
これを防ぐためには@State
をプロパティに付与する(SwiftUIのみ)またはdamage関数
にmutating
を付与します。これによりプロパティの値を変更することができるようなります。
struct Character {
@State var hitPoint: Int = 100
// ↑ ↓ どちらか
mutating func damage() {
hitPoint -= 30
}
}
私がSwift UI学習に使用した参考書
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。