| iOS | 17.0以上 |
| XCode(当サイトの環境) | 15.0.1 |
SwiftUIにおいてプロパティの値をチェックする際には、いくつか方法があります。ここではdidSetを使用した方法を紹介します。
プロパティが変更されたときにその変更を監視し、必要に応じて特定のアクションを実行することができます。
didSetの基本的な使い方
例えば、以下のようにdidSetを使用してプロパティの値を監視することができます。
import SwiftUI
struct didsetSmpView: View {
@State private var counter = 0 {
didSet {
if counter < 0 {
counter = oldValue // プロパティの値が0未満にならないように制御
print("oldValue set") // ログ出力
}
}
}
var body: some View {
VStack {
Text("Counter: \(counter)")
Button("Increment") {
counter += 1 // ボタンがタップされたらcountを増やす
}
Button("Decrement") {
counter -= 1 // ボタンがタップされたらcountを減らす
}
}
}
}

didSetは、@Stateなどのプロパティラッパーと一緒に使用されることが多いです。プロパティの値が変更されたとき、didSetブロック内のコードが実行されます。この例では、countプロパティの値が変更された後に、値が0未満にならないように制御しています。
注意点と使いどころ
didSetはプロパティの値がコードによって変更された場合にのみトリガーされます。イニシャライザ内で初期化されたときにはトリガーされません。- UIの更新は
@Stateや@Bindingの変更によって行われるため、didSet内でUIを変更することは推奨されません。
実際の使用例
- プロパティの変更時にログを出力する。
- 特定の値の範囲外に変更されないように制御する。
- プロパティの変更に応じて非同期処理をトリガーする。
didSetはプロパティの監視と制御に役立ちます。プロパティの変更に応じて特定の処理を行いたい場合に、didSetを活用することができます。
このように、didSetを使用してプロパティの変更を監視し、特定の処理を実行する方法があります。特に制約や値の制御に役立ちますが、UIの更新には@Stateや@Bindingを使用することをお勧めします。
参考:onChangeとdidSetの使い分け
onChangeとdidSetは、SwiftUIでプロパティの変更を監視するための機能ですが、それぞれ異なるコンテキストで使われます。
onChange
- SwiftUIでの使用:
View内のプロパティの変更を監視する際に使用されます。 - 例: ユーザーがテキストフィールド内のテキストを変更したときに、その変更をキャッチしてアクションをトリガーする場合に使用されます。
TextField("Enter text", text: $text)
.onChange(of: text) { newValue in
// textプロパティが変更されたときの処理
}
didSet
- Swift言語全般での使用: Swiftのプロパティに直接適用されるプロパティ監視子です。
- 例: SwiftUIの
@Stateや@ObservedObjectのプロパティ内で値の変更を監視し、制御や特定の処理を行う場合に使用されます。
@State private var count = 0 {
didSet {
if count < 0 {
count = 0
}
}
}
使い分け
onChange: SwiftUIのビュー内で、他のプロパティの変更を監視するために使用されます。特にUIの更新など、Viewの特定の部分に関連する処理を行う場合に便利です。didSet: Swift言語でプロパティの変更を監視し、特定の条件下での制御や、値の変更に応じた処理を行うために使用されます。SwiftUIのビューの外でプロパティの変更を監視することが主な目的です。
両方とも、プロパティの変更を監視し、それに応じたアクションをトリガーするための機能ですが、onChangeは主にView内で、didSetはSwift言語全般で使用される点が異なります。

