0Pricing
Swift Academy · レッスン

複数のプロパティラッパーの合成

プロパティラッパーを重ねて使用し、その初期化順序を理解します。

「複数のプロパティラッパーの合成」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

ようこそ

複数のプロパティラッパーを1つのプロパティに適用できます。適用する順序が重要です。外側のラッパーが内側のラッパーをラップし、初期化の順序は宣言の順序に従います。

ラッパーのスタック

```swift @propertyWrapper struct A { var wrappedValue: Int { didSet { print("A") } } init(wrappedValue: Int) { self.wrappedValue = wrappedValue } } @propertyWrapper struct B { var wrappedValue: Int { didSet { print("B") } } init(wrappedValue: Int) { self.wrappedValue = wrappedValue } } struct S { @A @B var x = 0 } ```

外側が内側をラップ

`@A @B var x` と記述すると、構文糖衣を取り除いた形は次のようになります。 ```swift var _x: A> = A(wrappedValue: B(wrappedValue: 0)) ``` AがBをラップし、BがIntをラップします。

実例: @NonEmpty + @Trimmed

```swift @propertyWrapper struct Trimmed { var wrappedValue: String { didSet { wrappedValue = wrappedValue.trimmingCharacters(in:.whitespaces) } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.trimmingCharacters(in:.whitespaces) } } @propertyWrapper struct NonEmpty { var wrappedValue: String { didSet { if wrappedValue.isEmpty { wrappedValue = "(empty)" } } } init(wrappedValue: String) { self.wrappedValue = wrappedValue.isEmpty ? "(empty)" : wrappedValue } } struct Form { @NonEmpty @Trimmed var username = " " } ```

初期化順序

ラッパーは最も外側から最も内側へ向かって初期化されます。つまり、外側のラッパーのinitが受け取るのは、元の値ではなく、内側のラッパーによる変換結果です。

ラッパーをスタックする場合の制限

• すべてのラッパーがきれいに合成できるとは限りません。`wrappedValue` の型が一致することを確認してください • Swiftコンパイラーが複数のラッパーを常に許可するとは限りません(ラップされる型の互換性によります) • `projectedValue` へのアクセス `$x` で到達できるのは、最も外側のラッパーの射影だけです

SwiftUIの例: @EnvironmentObject + Observation

SwiftUIでは、同じプロパティに `@EnvironmentObject` と `@Published` を重ねて指定することはできません。ただし、内部で `@Published` を使用している `@EnvironmentObject` モデルは監視できます。

スタックしたラッパーのデバッグ

`_propertyName` を使うと、ラッパーのインスタンスに直接アクセスできます。 ```swift print(form._username) // A> — the outer wrapper instance ```

別の方法: 1つのラッパーの内部で合成する

多くの場合、ロジックを1つのラッパーの内部で合成したほうがすっきりします。 ```swift @propertyWrapper struct CleanUsername { var wrappedValue: String { didSet { wrappedValue = clean(wrappedValue) } } func clean(_ s: String) -> String { let t = s.trimmingCharacters(in:.whitespaces) return t.isEmpty ? "(empty)" : t } } ```

実践的なスタックパターン

一般的に有効なスタックの例: • `@UserDefault` + `@Published`(データの永続化 + 監視) • `@NonNegative` + `@Clamped`(検証レイヤー) • フレームワーク固有の例: SwiftUIビューでの `@Environment` + `@Binding`

確認問題

2つのプロパティラッパーをスタックした場合、どちらが先に初期化されますか?

まとめ

重要なポイント: • `@A @B var x` は `A>` に展開されます • 外側のラッパーは、内側の `wrappedValue` を入力として初期化されます • `$x` で到達できるのは、最も外側の `projectedValue` だけです • `_x` でラッパーのインスタンスに直接アクセスできます • 可能であれば、深くスタックするより、1つのラッパーにまとめる方法を優先してください コース完了です!次はResult型です。

よくある質問

「複数のプロパティラッパーの合成」レッスンは無料ですか?

はい。「複数のプロパティラッパーの合成」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「複数のプロパティラッパーの合成」で何を学びますか?

プロパティラッパーを重ねて使用し、その初期化順序を理解します。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「複数のプロパティラッパーの合成」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. カスタムプロパティラッパーの作成
  2. $bindingによる射影値
  3. Combineにおける@Publishedとオブザベーション
  4. 複数のプロパティラッパーの合成
← Swift Academyに戻る