まず変数(Variables)とは
変数(Variables)は、プログラムでデータや値を格納するための「箱」のようなものです。Swiftでは、var
キーワードを使って変数を宣言します。変数には様々な種類のデータを格納することができます。
これらの変数には、それぞれの状態や遷移の情報が格納されています。
SwiftUIでの状態管理に用いる@State
と@Binding
を説明します。
@State
とは
@State
は、SwiftUIで状態を管理するためのプロパティラッパーです。@State
を付けた変数は、SwiftUIのビュー内でその状態を管理します。この状態が変更されると、SwiftUIは自動的にビューを再描画します。
これらのプロパティラッパーを使うことで、SwiftUIでは簡単に状態を管理し、ビュー間でデータの受け渡しや同期が行えます。
@State
使用例
例えば、「ボタンを押したらTextの文字を変える」というプログラムを考えてみましょう。この動作を実現するには、ボタンが押されたことを検知して、Textの内容を変更するための変数が必要です。
import SwiftUI
struct ContentView: View {
@State var str = "Hello, world!"
var body: some View {
VStack {
Text(str)
.padding()
Button {
str = "ハローワールド"
} label: {
Text("ボタン")
}
}
}
}
この画面は、テキストとボタンのみが表示されるシンプルな構成です。
テキストでは、変数str
の内容を表示しています。str
は初めに "Hello, world!" という文字列で初期化されているため、画面には "Hello, world!" と表示されます。
ボタンをタップすると、str
変数に "ハローワールド" という新しい文字列が代入され、これによりテキストの表示が "Hello, world!" ⇒ "ハローワールド" に変わります。
このように、テキストの内容をstr
という変数に紐づけることで、ボタンを押すことでテキストの表示を変更することが可能になります。変数str
がなければ、このプログラムは実装できません。
動きを見てみよう
ボタンをタップしたことで、str
変数に "ハローワールド" という新しい文字列が代入されてテキストの表示が "Hello, world!" ⇒ "ハローワールド" に変わります。
変数に@State
をつけると変わること
通常の変数とは異なる2つの主な点があります。
-
値が変わったらViewがリロードされる:
@State
が付いた変数を変更すると、それが反映される部分のViewが再描画されます。ボタンなどで@State
変数を変更すると、Viewが再読み込みされます。もし@State
が付いていない変数を変更しても、Viewの再描画は行われず、表示は更新されません。 -
Structの中で値を変更できる:
Swift言語のルール上、通常のstruct内では変数の変更ができません。しかし、@State
を付けることでstruct内でも変数の変更が可能になります。これにより、Viewの状態を変更するたびに再描画がトリガーされます。
まとめると、@State
はstruct内で値を変更できるようにし、変更されるたびに再描画される修飾子であると言えます。
補足
var, let の違い
var
とlet
は、Swift言語における変数宣言のためのキーワードであり、それぞれ異なる振る舞い方をします。
-
var
var
は「variable(変数)」の略であり、変更可能な(mutable)変数を宣言する際に使用します。変数がvar
で宣言されると、その値は後で変更することができます。var myVariable = 10 myVariable = 20 // 値の変更が可能
-
let
let
は「constant(定数)」の略であり、変更不可能な(immutable)定数を宣言する際に使用します。定数がlet
で宣言されると、一度値を割り当てた後はその値を変更することはできません。let myConstant = 30 myConstant = 40 // これはエラーになる(定数の再代入は不可)
主な違いは、var
で宣言した変数は後で値を変更できる(mutable)のに対し、let
で宣言した定数は値を変更できない(immutable)点です。一般的には、変更される可能性がある変数はvar
、一度値が設定されたら変更されない値はlet
を使うと良いです。また、Swiftでは、できるだけ定数を使って変更不要の変数を使用することが推奨されています。