Swift Digest
Blog | Swift.org Blog

Exploring Swift: 実例で見る property wrapper

Exploring Swift: Property wrappers in the wild

このダイジェストはClaude Opus 4.7 / 4.8によって生成されたものです(License)。原文はこちら

この記事の要点

property wrapper とは

property wrapper は、プロパティの読み書きに共通して現れる処理を、独立した型としてまとめて再利用できるようにする機能です。Erica Sadun のトーク(dotSwift 2020)では、property wrapper の価値が「振る舞いの契約を、プロパティの 利用箇所 ではなく 宣言箇所 で指定できること」にあると説明されています。たとえば「この値は常に特定の範囲に収める」「この値は永続化する」といった約束を、プロパティ定義の場所に一度書くだけで表現できます。

property wrapper には大きく 2 つの値が関わります。

Stewart Lynch のトークでは、この wrapped value と projected value の両方が、UIKit と SwiftUI のそれぞれでどう役立つかが具体的に示されています。

何ができるのか

property wrapper の主な効果は、繰り返し現れる定型処理を取り除き、コードを簡潔にする ことです。記事で紹介されているコミュニティの解説では、次のようなテーマが扱われています。

SwiftUI 向けには、DynamicProperty プロトコルを使ってカスタム property wrapper を書く方法も紹介されています(Donny Wals)。DynamicProperty に適合させると、SwiftUI のビュー更新の仕組みと連動する property wrapper を自作でき、たとえば次のように簡潔なコードが書けます。

struct ContentView: View {
    @Setting(\.onboardingCompleted) var didOnboard

    var body: some View {
        Text("Onboarding completed: \(didOnboard ? "Yes" : "No")")

        Button("Complete onboarding") {
            didOnboard = true
        }
    }
}

ここでは @Setting というカスタム property wrapper が、設定値の読み書き(永続化など)を内部に隠しています。ビュー側は didOnboard を普通の Bool のように読み書きするだけで済み、設定ストアへのアクセスといった定型処理がコードから消えます。

活用とパッケージ

property wrapper をゼロから書かなくても、既存のパッケージを利用できます。記事では次の 2 つが挙げられています。

これらを使うと、バリデーションや値の正規化といった処理を、宣言箇所の注釈だけで適用できます。

関連リンク