【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(プロパティラッパ)」には他にも子の構造体から親の構造体のプロパティを変更できるようにする@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学習に使用した参考書

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index